ToB企服应用市场:ToB评测及商务社交产业平台

标题: MySQL 主从复制与读写分离 [打印本页]

作者: 九天猎人    时间: 2024-8-4 15:05
标题: MySQL 主从复制与读写分离
一、案例概述


二、案例前置知识点

1、MySQL 主从复制原理

实验报告

资源列表

主机操纵系统IP配置masterCentOS7192.168.72.1312C4Gslave1CentOS7192.168.72.1322C4Gslave2CentOS7192.168.72.1332C4GamoebaCentOS7192.168.72.1342C4GclientCentOS7192.168.72.1302C4G 基础情况


  1. systemctl stop firewalld
  2. systemctl disable firewalld
复制代码

  1. setenforce 0
  2. sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
复制代码

  1. hostnamectl set-hostname master
  2. hostnamectl set-hostname slave1
  3. hostnamectl set-hostname slave2
  4. hostnamectl set-hostname amoeba
  5. hostnamectl set-hostname client
复制代码
一、搭建 MySQL 主从复制

1、安装 MySQL 数据库

  1. # 上传脚本
  2. [root@master ~]# tar zxf auto-install-mysql57-glibc.tar.gz
  3. [root@master ~]# cd auto-install-mysql57-glibc
  4. [root@master auto-install-mysql57-glibc]# ls
  5. auto-install-mysql57-glibc.sh  my.cnf  mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz
  6. [root@master auto-install-mysql57-glibc]# ./auto-install-mysql57-glibc.sh
  7. set password=password('123');
复制代码
2、配置 master 主服务器

master

  1. # 开启二进制日志
  2. [root@master ~]# vi /etc/my.cnf
  3. [mysqld]
  4. log-bin=master-bin
  5. binlog-format = MIXED
  6. server-id = 1
  7. # 重启 MySQL 服务
  8. [root@master ~]# systemctl restart mysqld
  9. [root@master ~]# ls /usr/local/mysql/data/
  10. auto.cnf         client-key.pem  ib_logfile1        master.err  mysql.sock.lock     server-cert.pem
  11. ca-key.pem       ib_buffer_pool  ibtmp1             master.pid  performance_schema  server-key.pem
  12. ca.pem           ibdata1         master-bin.000001  mysql       private_key.pem     sys
  13. client-cert.pem  ib_logfile0     master-bin.index   mysql.sock  public_key.pem
  14. # 登录 MySQL 程序,给从服务器授权
  15. mysql> grant replication slave on *.* to 'myslave'@'192.168.72.%' identified by '123456';
  16. Query OK, 0 rows affected, 1 warning (0.02 sec)
  17. # 刷新权限
  18. mysql> flush privileges;
  19. Query OK, 0 rows affected (0.03 sec)
  20. # MySQL 返回了主服务器的二进制日志(binary log)的当前状态
  21. mysql> show master status;
  22. +-------------------+----------+--------------+------------------+-------------------+
  23. | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  24. +-------------------+----------+--------------+------------------+-------------------+
  25. | master-bin.000001 |      603 |              |                  |                   |
  26. +-------------------+----------+--------------+------------------+-------------------+
  27. 1 row in set (0.03 sec)
复制代码
3、配置 slave 从服务器

slave1

  1. # 开启二进制日志
  2. [root@slave1 ~]# vi /etc/my.cnf
  3. [mysqld]
  4. log-bin=slave1-bin
  5. binlog-format = MIXED
  6. server-id = 2
  7. # 重启 MySQL 服务
  8. [root@slave1 ~]# systemctl restart mysqld
  9. [root@slave1 ~]# ls /usr/local/mysql/data/
  10. auto.cnf         client-key.pem  ib_logfile1  mysql.sock.lock     server-cert.pem    slave1.err
  11. ca-key.pem       ib_buffer_pool  ibtmp1       performance_schema  server-key.pem     slave1.pid
  12. ca.pem           ibdata1         mysql        private_key.pem     slave1-bin.000001  sys
  13. client-cert.pem  ib_logfile0     mysql.sock   public_key.pem      slave1-bin.index
  14. # MySQL复制环境中用于配置从服务器(slave)以连接到主服务器(master)并开始复制过程
  15. mysql> change master to master_host='192.168.72.131',        # master 主机的IP
  16.     -> master_user='myslave',        # master 主机设置的用户名
  17.     -> master_password='123456',        # master 主机设置的密码
  18.     -> master_log_file='master-bin.000001',
  19.         # master 主机的日志文件
  20.     -> master_log_pos=603;
  21.         # master 主机的偏移量 当前二进制日志的位置
  22. Query OK, 0 rows affected, 2 warnings (0.04 sec)
  23. mysql> start slave;
  24. Query OK, 0 rows affected (0.01 sec)
  25. # 检查从服务器的复制状态
  26. mysql> show slave status\G;
  27. *************************** 1. row ***************************
  28. ...... # 省略部分代码
  29.              Slave_IO_Running: Yes
  30.             Slave_SQL_Running: Yes
  31.                      
  32. ...... # 省略部分代码
  33. 1 row in set (0.00 sec)
  34. # 如果出现错误,执行重置重新写
  35. # 关闭   
  36. stop slave;
  37. # 重置
  38. reset slave;
复制代码
slave2

  1. # 开启二进制日志
  2. [root@slave2 ~]# vi /etc/my.cnf
  3. [mysqld]
  4. log-bin=slave2-bin
  5. binlog-format = MIXED
  6. server-id = 3
  7. # 重启 MySQL 服务
  8. [root@slave2 ~]# systemctl restart mysqld
  9. [root@slave2 ~]# ls /usr/local/mysql/data/
  10. auto.cnf         client-key.pem  ib_logfile1  mysql.sock.lock     server-cert.pem    slave2.err
  11. ca-key.pem       ib_buffer_pool  ibtmp1       performance_schema  server-key.pem     slave2.pid
  12. ca.pem           ibdata1         mysql        private_key.pem     slave2-bin.000001  sys
  13. client-cert.pem  ib_logfile0     mysql.sock   public_key.pem      slave2-bin.index
  14. # MySQL复制环境中用于配置从服务器(slave)以连接到主服务器(master)并开始复制过程
  15. mysql> change master to master_host='192.168.72.131',        # master 主机的IP
  16.     -> master_user='myslave',        # master 主机设置的用户名
  17.     -> master_password='123456',        # master 主机设置的密码
  18.     -> master_log_file='master-bin.000001',
  19.         # master 主机的日志文件
  20.     -> master_log_pos=603;
  21.         # master 主机的偏移量    当前二进制日志的位置
  22. Query OK, 0 rows affected, 2 warnings (0.04 sec)
  23. mysql> start slave;
  24. Query OK, 0 rows affected (0.01 sec)
  25. # 检查从服务器的复制状态
  26. mysql> show slave status\G;
  27. *************************** 1. row ***************************
  28. ...... # 省略部分代码
  29.              Slave_IO_Running: Yes
  30.             Slave_SQL_Running: Yes
  31.                      
  32. ...... # 省略部分代码
  33. 1 row in set (0.00 sec)
  34. # 如果出现错误,执行重置重新写
  35. # 关闭   
  36. stop slave;
  37. # 重置
  38. reset slave;
  39.    
复制代码
4、验证主从复制效果

  1. # 在主、从服务器上登录 MySQL
  2. mysql -uroot -p123
  3. # 在主服务器上新建数据库 kgc
  4. mysql> create database kgc;
  5. Query OK, 1 row affected (0.01 sec)
  6. # 在两台从服务器上分别查看数据库,显示数据库相同,则主从复制成功
  7. mysql> show databases;
  8. +--------------------+
  9. | Database           |
  10. +--------------------+
  11. | information_schema |
  12. | kgc                |
  13. | mysql              |
  14. | performance_schema |
  15. | sys                |
  16. +--------------------+
  17. 5 rows in set (0.00 sec)
复制代码
二、搭建 MySQL 读写分离

1、在 Amoeba 主机上安装 Java 情况

  1. [root@master ~]# chmod +x jdk-6u14-linux-x64.bin
  2. [root@master ~]# ./jdk-6u14-linux-x64.bin        //根据提示按 Enter 键完成即可
  3. [root@master ~]# mv jdk1.6.0_14/ /usr/local/jdk1.6
  4. [root@master ~]# vi /etc/profile
  5. cat >> /etc/profile << 'EOF'
  6. export JAVA_HOME=/usr/local/jdk1.6
  7. export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
  8. export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
  9. export AMOEBA_HOME=/usr/local/amoeba/
  10. export PATH=$PATH:$AMOEBA_HOME/bin
  11. EOF
  12. # 刷新环境变量
  13. source /etc/profile
  14. # 查看版本号
  15. [root@master ~]# java -version
  16. java version "1.6.0_14"
  17. Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
  18. Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)
复制代码
2、安装并配置 Amoeba 软件

  1. mkdir /usr/local/amoeba
  2. tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
  3. chmod -R 755 /usr/local/amoeba/
  4. # 显示此内容说明 Amoeba 安装成功
  5. [root@amoeba ~]# amoeba
  6. amoeba start|stop
复制代码
3、配置 Amoeba 读写分离,两个 Slave 读负载均衡

  1. SHOW GRANTS;    # 查看所有权限
  2. select user from mysql.user;    # 查看所有用户
  3. delete from mysql.user where user='test';    # 删除指定test用户
  4. # (1)master、slave1、slave2 中开放权限给 Amoeba 访问
  5. # 在 master 节点操作
  6. # 登录 MySQL 程序,给从服务器授权
  7. grant all on *.* to test@'192.168.72.%' identified by '123.com';
  8. # 刷新权限
  9. flush privileges;
  10. # 创建 test 数据库
  11. create database test;
  12. # 在 amoeba 节点操作
  13. # (2)编辑 amoeba.xml 配置文件
  14. [root@master ~]# cd /usr/local/amoeba/conf
  15. [root@master conf]# vi amoeba.xml
  16. # 在 30 行左右修改 user 和 password
  17. ...... # 省略部分代码
  18. <property name="user">amoeba</property>
  19. <property name="password">123456</property>
  20. ...... # 省略部分代码
  21. # 在 115 行左右修改 defaultPool、writePool、readPool
  22. ...... # 省略部分代码
  23. <property name="defaultPool">master</property>
  24. <property name="writePool">master</property>
  25. <property name="readPool">slaves</property>
  26. ...... # 省略部分代码
  27. # (3)编辑 dbServers.xml 配置文件
  28. [root@master conf]# vi dbServers.xml
  29. # 在 26 行左右修改 user 和 password 写在master数据库给权限的用户和密码
  30. ...... # 省略部分代码
  31. <!-- mysql user -->
  32. <property name="user">test</property>
  33. <!--  mysql password
  34. -->
  35. <property name="password">123.com</property>
  36. ...... # 省略部分代码
  37. # 在 45 行左右修改以下内容
  38. ...... # 省略部分代码
  39.         <dbServer name="master"  parent="abstractServer">
  40.                 <factoryConfig>
  41.                         <!-- mysql ip -->
  42.                         <property name="ipAddress">192.168.72.131</property>
  43.                 </factoryConfig>
  44.         </dbServer>
  45.         <dbServer name="slave1"  parent="abstractServer">
  46.                 <factoryConfig>
  47.                         <!-- mysql ip -->
  48.                         <property name="ipAddress">192.168.72.132</property>
  49.                 </factoryConfig>
  50.         </dbServer>
  51.         <dbServer name="slave2"  parent="abstractServer">    # 若无slave2 段,手动添加
  52.                 <factoryConfig>
  53.                         <!-- mysql ip -->
  54.                         <property name="ipAddress">192.168.72.133</property>
  55.                 </factoryConfig>
  56.         </dbServer>
  57. ...... # 省略部分代码
  58. # 在 66 行左右修改以下内容
  59. ...... # 省略部分代码
  60.         <dbServer name="slaves" virtual="true">
  61.                 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
  62.                         <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
  63.                         <property name="loadbalance">1</property>
  64.         
  65.                         <!-- Separated by commas,such as: server1,server2,server1 -->
  66.                         <property name="poolNames">slave1,slave2</property>
  67.                 </poolConfig>
  68.         </dbServer>        
  69. ...... # 省略部分代码
  70. # (4)配置无误后,可以启动 Amoeba 软件,其默认端口为 tcp 8066
  71. [root@amoeba ~]# amoeba start &
  72. [1] 9705
  73. [root@amoeba ~]# netstat -anpt | grep 8066
  74. tcp6       0      0 :::8066                 :::*                    LISTEN      9705/java              
复制代码
4、测试

  1. # (1)在 client 主机上安装mariadb
  2. yum -y install mariadb
  3. # (2)登录
  4. # IP地址和端口是 amoeba 的地址和端口
  5. mysql -u amoeba -p123456 -h 192.168.72.134 -P 8066
  6. # (3)在 Master 上创建一个表,同步到各从服务器上,然后关掉各从服务器的 Slave功能,再插入区别语句。
  7. # 在 master节点创建表
  8. use test;
  9. CREATE TABLE `kgc` (
  10.     `id` int(10) NOT NULL,
  11.     `name` VARCHAR(10) DEFAULT NULL
  12. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  13. # slave节点执行
  14. stop slave;
  15. # master节点执行
  16. insert into kgc values(1,'张三');
  17. # slave1节点执行
  18. insert into kgc values(2,'李四');
  19. # slave2节点执行
  20. insert into kgc values(3,'王五');
  21. # (4)测试读操作
  22. # 第一次查询
  23. MySQL [(none)]> select * from test.kgc;
  24. +----+--------+
  25. | id | name   |
  26. +----+--------+
  27. |  3 | 王五   |
  28. +----+--------+
  29. 1 row in set (0.03 sec)
  30. # 第二次查询
  31. MySQL [(none)]> select * from test.kgc;
  32. +----+--------+
  33. | id | name   |
  34. +----+--------+
  35. |  2 | 李四   |
  36. +----+--------+
  37. 1 row in set (0.01 sec)
  38. # 第三次查询
  39. MySQL [(none)]> select * from test.kgc;
  40. +----+--------+
  41. | id | name   |
  42. +----+--------+
  43. |  3 | 王五   |
  44. +----+--------+
  45. 1 row in set (0.00 sec)
  46. # (5)测试写操作
  47. # 在client主机上插入一条数据
  48. insert into kgc values(4,'张涛');
  49. # 但在 Client 上查询不到,最终只有在 Master 上才能查看到这条语句内容,说明写操作在 Master 服务器上
  50. MySQL [(none)]> select * from test.kgc;
  51. +----+--------+
  52. | id | name   |
  53. +----+--------+
  54. |  2 | 李四   |
  55. +----+--------+
  56. 1 row in set (0.00 sec)
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4