jericho0702 发表于 2018-10-2 12:00:45

MySQL主从同步+读写分离

MySQL主从同步+读写分离
  实验拓扑:
  三台mysql数据库:
  192.168.80.101    主服务器            mysql
  192.168.80.102    从1服务器             mysql
  192.168.80.103    从2服务器             mysql
  192.168.80.104    调度器Amoeba服务器jdk、amoeba
  192.168.80.105    mysql客户端            mysql
  第一部分:三台mysql服务器主从同步
  一、mysql主服务器配置:192.168.80.101
  1、安装配置NTP时间服务器:
  yum install -y ntp            //建立时间同步环境,在主节点上搭建时间同步服务器
  vi /etc/ntp.conf
  restrict 192.168.80.0 mask 255.255.255.0 nomodify notrap    //去掉#,并修改其网段
  server 127.127.1.0      //以下两行新加
  fudge 127.127.1.0 stratum 8 //设置时间服务器的层级为8级,顶级是0
  :x
  service ntpd restart       //重启ntp服务器
  service firewalld stop
  setenforce 0      //关闭防火墙和安全SELinux
  2、源码编译安装MYSQL:
  省略
  http://blog.51cto.com/13572519/2116742
  3、配置master主服务器的MYSQL:
  vi /etc/my.cnf //在 下面配置
  server_id = 11       //修改
  log_bin=master_bin       //开启二进制日志
  log_slave_updates=true      //在mysqld区域修改添加这三行,server_id主从都不一致,允许从服务器来主服务器更新数据库
  :x
  service mysqld restart
  mysql -u root -p   //登录数据库

  GRANT REPLICATION SLAVE ON . TO 'myslave'@'192.168.80.%'>  FLUSH PRIVILEGES;         //刷新权限
  show master status; //查看当前库的状态,要记下 Position 列的值

  二、mysql从服务器配置:192.168.80.102和192.168.80.103
  service firewalld stop
  setenforce 0
  1、安装配置NTP时间服务器:
  yum install -y ntpdate
  ntpdate 192.168.80.101                //手动与主服务器时间节点进行同步(我的操作此步,mysqld不能重启)
  echo '/30 * /usr/sbin/ntpdate 192.168.80.101' >> /var/spool/cron/root   //写计划任务,每隔三十分钟,自动同步时间
  crontab -l    //查看计划任务

  2、源码编译安装MYSQL:
  省略
  http://blog.51cto.com/13572519/2116742
  3、配置两台master从服务器的MYSQL:
  vi /etc/my.cnf    //下面
  server_id = 22         // 各服务器之间的server_id的值不能相同从2设置33
  relay_log=relay-log-bin
  relay_log_index=slave-relay-bin.index
  :x
  service mysqld restart
  mysql -u root -p   //登录数据库
  --注意master_logpos=的值会变化,要在主上使用show master status;查看一下,注意 -和
  change master to master_host='192.168.80.101',master_user='myslave',master_password='123456',master_log_file='master_bin.000002',master_log_pos=154;
  start slave;
  show slave status \G //以下两个选项需要是Yes才正确

  **二、验证MYSQL主从同步:
  在主服务器上新建库并在从服务器上验证是否同步
  mysql -u root -p
  create database master;
  show databases;   //主服务器创建好数据库,在从服务器上查看,从服务器上也会时时同步*


  主从同步实验成功!!!
  第二部分:配置mysql服务器读写分离
  一、在Amoeba服务器上配置:192.168.80.104**
  service firewalld stop
  setenforce 0
  1、安装配置NTP时间服务器:
  yum install -y ntpdate
  ntpdate 192.168.80.101
  echo '/30 * /usr/sbin/ntpdate 192.168.80.181' >> /var/spool/cron/root
  crontab -l
  2、安装JDK:
  Amoeba(变形虫)是基于JDK开发的,所以安装之前要先安装JDK
  使用WinSCP将JDK和Amoeba安装包传到服务器上


  tar xf jdk-8u144-linux-x64.tar.gz -C /opt
  cp -rv /opt/jdk1.8.0_144/ /usr/local/java
  vi /etc/profile   //末尾新增
  export JAVA_HOME=/usr/local/java
  export JRE_HOME=/usr/local/java/jre
  export PATH=$PATH:/usr/local/java/bin

  export>  :x
  source /etc/profile      //立即生效
  java -version

  3、安装amoeba:
  https://sourceforge.net/projects/amoeba/files/    //下载地址
  yum install -y unzip
  unzip amoeba-mysql-3.0.5-RC-distribution.zip -d /usr/local/
  mv /usr/local/amoeba-mysql-3.0.5-RC/ /usr/local/amoeba
  chmod -R 755 /usr/local/amoeba/
  vi /usr/local/amoeba/jvm.properties
  32行: JVM_OPTIONS="-server -Xms256m -Xmx1024m -Xss196k -XX:PermSize=16m -XX:MaxPermSize=96m"
  JVM_OPTIONS="-server -Xms1024m -Xmx1024m -Xss256k"    //增加此行
  :x
  4、制作amoeba管理脚本
  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/bin/launcher
  SHUTDOWN_BIN=/usr/local/amoeba/bin/shutdown
  PIDFILE=/usr/local/amoeba/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
  chmod +x /etc/init.d/amoeba
  chkconfig --add amoeba
  service amoeba start
  ctrl+z   // amoeba启动比较慢,放到后台暂停运行
  bg    //后台继续运行此进程
  netstat -anpt | grep 8066 //默认监听在8066端口

  二、配置读写分离
  1、主服务器创建test数据库
  mysql -u root -p
  create database test;
  show databases;

  2、在三台mysql数据库中为amoeba授权

  GRANT ALLON . TO test@'192.168.80.%'>  FLUSH PRIVILEGES;
  3、在调度服务器Amoeba上配置配置文件
  vi /usr/local/amoeba/conf/amoeba.xml
  ---28行-----设置客户端连接amoeba服务器时使用的用户名和密码----
  amoeba
  123456   //以上配置用于客户端连接用户名密码
  ---83-88行--去掉注释-同时把默认的server1改成master,把默认的servers改成 slaves
  master
  master
  slaves
  vi /usr/local/amoeba/conf/dbServers.xml
  ---26-28行--------
  test
  123
  主服务器配置:
  43
  46 192.168.80.101
  从服务器1配置:
  
  --53-从服务器地址-
  192.168.80.102
  从服务器2配置:
  //复制slave1相关代码,设置从2服务器
  
  192.168.80.103/property>
  //以下两行修改
  

    --末尾--
  slave1,slave2
  
  -------------------------------------------------------------注意--------------------------------------------------------------------------------
test //数据库中要有此处定义的数据库,否则客户端连接后会报如下错误:ERROR 1044 (42000): Could not create a validated object, cause: ValidateObject failed----------------------------------------------------------------------------------------------------------------------------------------------------service amoeba restartctrl+z   //停止并放到后台bg    //重启netstat -anpt | grep java![](http://i2.51cto.com/images/blog/201805/16/b3a1c5fa47c5be9ce50174757fb6a006.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)**第三部分:测试验证一、测试客户端:192.168.80.105**service firewalld stopsetenforce 0**1、    源码编译安装Mysql**:省略http://blog.51cto.com/13572519/2116742 **2、    测试读写分离:**mysql -u amoeba -p123456 -h 192.168.80.104 -P8066   //amoeba地址show databases;![](http://i2.51cto.com/images/blog/201805/16/094d3dd25b9182f787520c2e96cda858.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)//在MASTER上新建的数据库或者里面的表,两台从服务器会同步--通过amoeba操作的use test;create table liu (id int(10),name varchar(10),address varchar(20));show tables;       //三台数据库服务器上查看会是相同结果![](http://i2.51cto.com/images/blog/201805/16/280ba4ed7e4c110255d0f01d926ed16a.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)![](http://i2.51cto.com/images/blog/201805/16/55e7d8361a5e5c5f51ad25d80bd327c8.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)![](http://i2.51cto.com/images/blog/201805/16/202498e73c8bff1619540d57c9c527dc.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)在两台从上停止从服务后:stop slave;测试一:在主服务器上插入的内容不会同步-通过amoeba操作的在客户端上操作: insert into liu values('1','hahahha','this_is_master');在主服务器上查看:use test;select * from liu;![](http://i2.51cto.com/images/blog/201805/16/375c496042a5169730db59c3a36a866a.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)**结论:客户端写数据写到主服务器上测试二:在从服务器1上新建内容**use test;insert into liu values('2','liu','this_is_slave1');----从服务器2上新建内容----use test;insert into liu values('3','liu','this_is_slave2');------在客户端amoeba上测试----第一次会向从服务器1读数据-第二次会向从2读取select * from liu;![](http://i2.51cto.com/images/blog/201805/16/626d7f1ddf715a8d35fcbcef9dd05ec4.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)轮流读取从1从2上的内容**结论:客户端读取数据在从服务器读取,主服务器写的1数据读取不到****测试三:通过客户端连接数据库后写入的数据只有主会记录,然后同步给从-从服务器不会记录,从而实现了读写分离。**客户端写入:insert into liu values('4','liu','write_test');在客户端amoeba上看不到新插入的数据--因为同步没有开启-----只有主服务器上可以看到数据。select * from liu;    //客户端查看,没有4记录![](http://i2.51cto.com/images/blog/201805/16/b25ab6978776023a32f588af6e21a97c.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)select * from liu;    //主服务器查看,有4记录![](http://i2.51cto.com/images/blog/201805/16/3fbd35d6d8fba27593acbadf57773782.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)在客户端开启同步后,主服务器上数据会同步到各从服务器中,但是从服务器上自己增加的数据不会同步,只在从服务器本地保存start slave;select * from liu;      //两台从服务器上操作![](http://i2.51cto.com/images/blog/201805/16/d263d928ef1c10f81458805063412b09.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)![](http://i2.51cto.com/images/blog/201805/16/acd167320fa876d00b3e119d8145f19a.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)select * from liu;          //在客户端查看会看到主上同步过来的数据,以及自己本地增加的数据,但是看不到其它从上自己增加的数据![](http://i2.51cto.com/images/blog/201805/16/96e8506183df875503ee9f4862070011.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)**结论:1、主从同步2、关闭主从同步的话,客户端写的数据写在主服务器上面,在从服务器上轮流读取。3、从服务器只可以读取本地数据,以及同步的主上面的数据。实验成功!!!**
页: [1]
查看完整版本: MySQL主从同步+读写分离