在实际生产环境中,数据库读写都在同一个数据库服务中操作,无论在安全性、高可用性,还是高并发都是完全不能满足实际需求的,因此需要主从复制的方式来同步数据,在通过读写分离来提升负载能力的方案来进行。 mster开启二进制允许 从进行同步从开启二进制模式找谁同步 IO故障:授权,网络
只在主服务器上写,只在从服务器上读 主数据库处理事务性查询,从数据库处理select查询 数据库复制用于将事务性查询变更同步到集群中的从数据库 读写分离方案:基于程序代码内部实现 基于中间代理层实现 mysql-proxy amoeba 有三个账号需要创建并给权限的。
实验拓扑图 首先需要设置时间同步,不然会出问题
同步阿里云时间,时间同步协议ntp开放123端口 [root@localhost ~]# ntpdate ntp.aliyun.com首先配置主服务器
server-id = 11 ##服务器的id不能相同修改id log-bin = master-bin ##主服务器开启二进制文件日志名字叫master-bin log-slave-updates = true ##从服务器允许更新二进制文件日志 wq保存退出 刷新mysqld服务 [root@localhost mysql]# systemctl restart mysqld 检查二进制文件是否开启 [root@localhost mysql]# ls /usr/local/mysql/data/ master-bin.000001 ##有了这个就是开启了二进制文件 之后去开放权限,没用这个用户会自动产生,有了就是赋予权限 进入数据库 mysql -uroot -p mysql> grant replication slave on *.* to 'myslave'@'20.0.0.%' identified by '123456'; ##开启同步允许所有数据库表用过myslave准许的那个网段密码进行 Query OK, 0 rows affected, 1 warning (0.00 sec) 刷新 mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) 查看定位pos ##之后需要用到 mysql> show master status; +-------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-------------------+----------+--------------+------------------+-------------------+ | master-bin.000001 | 599 | | | | +-------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) 主服务器就设置完成了。设置从服务器
修改mysql配置文件 vi /etc/my.cnf server-id = 22 ##修改id号 relay-log = relay-log-bin ##开启中继日志 relay-log-index = slave-relay-bin.index ##定义位置并设置索引 wq保存刷新 [root@localhost mysql]# systemctl restart mysqld 进入数据库mysql -uroot -p mysql> change master to master_host='20.0.0.25',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=599; ## 设置主服务器地址,使用的用户,用户密码,指定的二进制文件名,主服务器pos值 Query OK, 0 rows affected, 2 warnings (0.01 sec) 开启功能 mysql> start slave; Query OK, 0 rows affected (0.00 sec) 查看是否启动线程 mysql> show slave status\G Slave_IO_Running: Yes Slave_SQL_Running: Yes 两个yes就表示开启了线程。 另一台从服务器配置相同,id不同就行。接下来设置amoeba服务器
先把jdk压缩包拖入,解压 [root@localhost opt]# tar xzvf jdk-8u144-linux-x64.tar.gz [root@localhost opt]# cp -rv jdk1.8.0_144/ /usr/local/java 之后修改profile配置文件 vi /etc/profile export JAVA_HOME=/usr/local/java ##调用类库,要依赖于java export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib ##指定环境变量bin能被识别 export AMOEBA_HOME=/usr/local/amoeba ##amoeba工作目录 export PATH=$PATH:$AMOEBA_HOME/bin ##便于amoeba命令被识别 wq保存然后刷新环境变量 [root@localhost opt]# source /etc/profile [root@localhost opt]# echo $PATH 查看里面有了amoeba和mysqlbin就完成了 /usr/local/mysql/bin:/usr/local/mysql/lib:/usr/local/mysql/bin:/usr/local/mysql/lib:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/amoeba/bin 然后将amoeba压缩包拉入opt下 解压amoeba并将文件拉入usr/local下的amoeba,并给755权限 [root@localhost opt]# unzip amoeba-mysql-3.0.5-RC-distribution.zip -d /usr/local/ [root@localhost opt]# mv /usr/local/amoeba-mysql-3.0.5-RC/ /usr/local/amoeba [root@localhost opt]# chmod -R 755 /usr/local/amoeba/ 修改32行 [root@localhost opt]# vi /usr/local/amoeba/amoeba-mysql-3.0.5-RC/jvm.properties JVM_OPTIONS="-server -Xms1024m -Xmx1024m -Xss256k" wq保存 制作amoeba管理脚本 [root@localhost opt]# vi /etc/init.d/amoeba #!/bin/bash #chkconfig: 35 62 62 # export JAVA_HOME=/usr/local/java export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH NAME=Amoeba AMOEBA_BIN=/usr/local/amoeba/amoeba-mysql-3.0.5-RC/bin/launcher SHUTDOWN_BIN=/usr/local/amoeba/amoeba-mysql-3.0.5-RC/bin/shutdown PIDFILE=/usr/local/amoeba/amoeba-mysql-3.0.5-RC/Amoeba-MySQL.pid SCRIPTNAME=/etc/init.d/amoeba case "$1" in start) echo -n "Starting $NAME... " $AMOEBA_BIN echo " done" ;; stop) echo -n "Stoping $NAME... " $SHUTDOWN_BIN echo " done" ;; restart) $SHUTDOWN_BIN sleep 1 $AMOEBA_BIN ;; *) echo "Usage: $SCRIPTNAME {start|stop|restart}" exit 1 ;; esac wq保存,给脚本权限 [root@localhost opt]# chmod +x /etc/init.d/amoeba [root@localhost opt]# chkconfig --add amoeba 重启amoeba [root@localhost opt]# service amoeba start 查看开没开启8066端口 [root@localhost bin]# netstat -anpt | grep 8066 tcp6 0 0 :::8066 :::* LISTEN 98518/java然后在三台主从服务器上开放端口
[root@localhost ~]# mysql -u root -p 5.7没test数据库需要创建 mysql> create database test; Query OK, 1 row affected (0.01 sec) mysql> grant all on *.* TO test@'20.0.0.%' IDENTIFIED BY '123456'; 刷新后退出 mysql> FLUSH PRIVILEGES; 回到amoeba服务器 [root@localhost conf]# cd /usr/local/amoeba/amoeba-mysql-3.0.5-RC/conf/ 因为java开发文件都是xml,需要加载标签 [root@localhost conf]# vi amoeba.xml ---28行-----设置客户端连接amoeba前端服务器时使用的用户名和密码---- <property name="user">amoeba</property> ----30行--------- <property name="password">123456</property> 83-去掉注释-同时把默认的server1改成master,把默认的servers改成 slaves <property name="defaultPool">master</property> <property name="writePool">master</property> <property name="readPool">slaves</property> wq保存退出 编辑db文件 [root@localhost conf]# vi dbServers.xml -26-29--去掉注释-- <property name="user">test</property> <property name="password">123456</property> ------主服务器地址--- 43 <dbServer name="master" parent="abstractServer"> 46 <property name="ipAddress">20.0.0.25</property> --50-从服务器主机名- <dbServer name="slave1" parent="abstractServer"> --53-从服务器地址- <property name="ipAddress">20.0.0.26</property> 还有一台复制粘贴改为28 shift+G到结尾 <dbServer name="slaves" virtual="true"> #####name后面改成 slaves <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"> <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA--> <property name="loadbalance">1</property> <!-- Separated by commas,such as: server1,server2,server1 --> <property name="poolNames">slave1,slave2</property> #####poolNames后面改成 slave1,slave2 </poolConfig> </dbServer> wq保存退出 刷新amoeba service amoeba restart mysql -u amoeba -p123456 -h 127.0.0.1 -P8066 ### 登录 amoeba服务端 Enter password: