案例概述
在实际的生产环境中.如果对数据库的读和写都在同一个数据库服务器中操作,无论是在安全性.高可用性还是高并发等各个方面都是完全不能满足实际需求的,因此,一般来说都是通过主从复制(Master-Slave)的方式来同步数据.再通过读写分离来提升数据库的并发负载能力这样的方案来进行部署与实施的。
如图10.1所示,--台MySQL主服务器带两台MySQL从服务器做了数据复制.前端应用在进行数据库写操作时,对主服务器进行操作,在进行数据库读操作时,对两台从服务器进行操作,这样大盘减轻了主服务器的压力。
1. MySQL主从复制原理
MySQL的主从复制和MySQL的读写分离两者有着紧密联系,首先要部署主从复制.只有主从复制完成了,才能在此基础上进行数据的读写分离。
1 )MySQL支持的复制类型
(1)基于语句的复制。在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL.默认采用基于语句的复制.效率比较高。
(2〉基于行的复制。把改变的内容复制过去.而不是把命令在从服务器上执行一遍。
(3)混合类型的复制。默认采用基于语句的复制.一旦发现基于语句无法精确复制时,就会采用基于行的复制。
部署配置实验
实验环境
虚拟机 3台 centos7.9
网卡NAT模式 数量 1
组件包mysql-5.6.36.tar.gz cmake-2.8.6.tar.gz
设备 | IP | 备注 |
Centos01 | 192.168.9.36 | Amoeba |
Centos02 | 192.168.9.34 | Master 从服务器 |
Centos03 | 192.168.9.35 | Slave 主服务器 |
初始配置
关闭防火墙 (192.168.9.34 ,192.168.9.35 ,192.168.9.36 )
Systemctl disable firewalld --now
关闭Selinux (192.168.9.34 ,192.168.9.35 ,192.168.9.36 )
setenforce 0
sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
配置IP DNS 网关 (192.168.9.34 ,192.168.9.35 ,192.168.9.36 )
nmtui
MySQL安装
安装所需组件包 (192.168.9.34 192.168.9.35)
yum -y install gcc gcc-c++ ntp vim net-tools ncurses-devel autoconf
上传mysql安装包 mysql-5.6.36.tar.gz cmake-2.8.6.tar.gz
解压cmakne (192.168.9.34 192.168.9.35)
tar zxf cmake-2.8.6.tar.gz
编译安装cmake (192.168.9.34 192.168.9.35)
cd cmake-2.8.6
./configure && gmake && gmake install
解压mysql (192.168.9.34 192.168.9.35)
[root@master cmake-2.8.6]# cd
[root@master ~]# tar zxf mysql-5.6.36.tar.gz
编译安装mysql (192.168.9.34 192.168.9.35)
[root@master]# cd mysql-5.6.36
[root@master mysql-5.6.36]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DSYSCONFDIR=/etc -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all
[root@master mysql-5.6.36]# make && make install
创建mysql用户和组 (192.168.9.34 192.168.9.35)
[root@master mysql-5.6.36]# groupadd mysql
[root@master mysql-5.6.36]# useradd -M -s /sbin/nologin mysql -g mysql
修改mysql安装目录权限 复制默认配置文件(192.168.9.34 192.168.9.35)
[root@master mysql-5.6.36]# chown -R mysql:mysql /usr/local/mysql
[root@slave ~]# cd /usr/local/mysql/
[root@master mysql-5.6.36]# cp support-files/my-default.cnf /etc/my.cnf
Mysql数据库 初始化(192.168.9.34 192.168.9.35)
[root@master mysql-5.6.36]# cd /usr/local/mysql/
[root@master mysql]# ./scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
添加mysql 到系统服务(192.168.9.34 192.168.9.35)
[root@master mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[root@master mysql]# chmod +x /etc/init.d/mysqld
[root@master mysql]# chkconfig --add mysqld
启动MySQL服务(192.168.9.34 192.168.9.35)
[root@master mysql]# systemctl start mysql
添加mysql操作指令关联系统 (192.168.9.34 192.168.9.35)
[root@master mysql]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile && . /etc/profile
用户登录测试 (192.168.9.34 192.168.9.35)
[root@master mysql]# mysql -u root
Mysql主从复制 (192.168.9.34 192.168.9.35)
mysql> exit
Bye
[root@master mysql]# cat << EOF >> /etc/ntp.conf
server 127.127.1.0
fudge 127.127.1.0 stratum 8
EOF
[root@master mysql]# systemctl start ntpd
192.168.9.35 的操作
[root@slave mysql]# netstat -anptu | grep ntp //查询端口
[root@slave mysql]# systemctl stop ntpd ( 关闭192.168.9.35 的 ntpd )
[root@slave mysql]# ntpdate 192.168.9.34
主服务器 master 192.168.9.35
修改配置文件
sed -i 's/# server_id = .*/server_id = 11/' /etc/my.cnf
sed -i '/server_id = 11/a\log_bin = master-bin' /etc/my.cnf
sed -i '/log_bin = master-bin/a\log-slave-updates = true' /etc/my.cnf
systemctl restart mysqld
创建授权用户 myslave 123456 192.168.9.35
mysql -u root
grant replication slave on *.* to 'myslave'@'192.168.9.%' identified by '123456';
flush privileges;
查看mysql 主节点状态 192.168.9.35
show master status;
记录file名字 和 position 编号 192.168.9.35
从服务器配置 slave 192.168.9.34
修改配置文件
sed -i 's/# server_id = .*/server_id = 22/' /etc/my.cnf
sed -i '/server_id = 22/a\relay-log = relay-log-bin' /etc/my.cnf
sed -i '/relay-log = relay-log-bin/a\relay-log-index = slave-relay-bin.index' /etc/my.cnf
systemctl restart mysqld
连接主服务器 192.168.9.34
mysql -u root
change master to master_host='192.168.9.35',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=412;
start slave;
show slave status\G;
MySQL读写分离 192.168.9.36
chmod +x jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin
mv jdk1.6.0_14 /usr/local/jdk1.6
添加java 运行环境变量 192.168.9.36
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:/$JAVA_HOME/jre/bin:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba/
java -version
部署amoeba 192.168.9.36
上传amoeba软件包
创建amoeba主目录
[root@node3 ~]# mkdir /usr/local/amoeba
[root@node3 ~]# tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
[root@node3 ~]# tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
编辑主配置文件 192.168.9.36
cd /usr/local/amoeba/
vim conf/amoeba.xml
<property name="user">root</property> 客户端连接的用户
<property name="password">123456</property> 客户端连接密码
取消注释
<property name="writePool">server1</property> 写入数据池名称
<property name="readPool">server2</property> 读取数据池名称
编辑数据库连接文件 192.168.9.36
vim conf/dbServers.xml
<property name="port">3306</property>
<property name="schema">test</property> 默认库 名称
<property name="user">root</property> 链接数据库用户名
<property name="password">abc-123</property> 链接数据库密码 如有注释要取消
修改ipaddress 127.0.0.1 为mysql 主和从的IP
<dbServer name="server1" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.9.34</property>
</factoryConfig>
</dbServer>
<dbServer name="server2" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.9.35</property>
</factoryConfig>
</dbServer>
启动amoeba 192.168.9.36
nohup ./bin/amoeba start 2>&1 &
查看端口 192.168.9.36
netstat -anpt
安装mysql客户端 192.168.9.36
yum -y install mariadb
连接amoeba测试 192.168.9.36
mysql -u root -p123456 -h 192.168.9.36 -P8066
创建表 192.168.9.36
mysql> use test; //进入库
MySQL [(none)]> create table info(id int(10),name varchar(10),address varchar(20));
//创建表
MySQL [(none)]> insert into info values('1','zhang','this_is_master'); //插入数据
show tables;
select * from info;
在 192.168.9.36 创建表和插入数据,然后在192.168.9.34 ,192.168.9.35 上面查询 ,看看刚才创建的表在不在 有没有同步,然后关掉 192.168.9.35 stop slave; 再创建看看有没有同步 ,再打开 start slave; 看有没有同步
[root@node3 amoeba]# source /etc/profile
[root@node3 amoeba]# bin/amoeba start&