1、mysql主主+主从+读写分离
1)主主+主从的作用
保证mysql数据库的可靠性
避免单点故障、防止数据丢失
2)读写分离的作用
增强网络的流量
区分读取流量和写入流量
3)缺点
从只能去一台主节点复制数据
当从数据库同步的主节点故障、从节点无法复制数据
2、mysql-mmm高可用的优势和配置文件
1)优势
配置mysql主服务器节点的高可用
避免主服务器主线单点故障
对两台主节点配置高可用,用户访问vip地址写入数据
2)配置文件
mmm_common.conf:主配置文件,数据库端和监控端都需要配置
mmm_agent.conf:监控端连接数据库使用,在所有的数据库端配置
mmm_mon.conf:监控配置文件,只在监控端配置
如图所示:
3、安装配置ntp服务
1)安装ntp服务
[root@master01 /]# yum -y install ntp (四台同时安装)
2)配置ntp服务
[root@master01 /]# systemctl restart ntpd
[root@master01 /]# systemctl enable ntpd
restrict 192.168.200.0 mask 255.255.255.0 nomodify notrap
server 127.127.1.0
fudge 127.127.1.0 stratum 8
[root@master02 ~]# ntpdate 192.168.200.10 将四台服务器的时间都同步了
4、修改主配置文件并重启
vim /etc/my.cnf
1)master01
[mysqld]
server-id = 10 数据库的ID号
log-bin = mysql-bin 开启二进制日志功能
log-slave-updates = true 允许从服务器更新数据
relay-log = relay-log-bin 数据库事件的单独编号文件
relay-log-index = relay-log-bin.index 记录relay-log-bin日志位置
2)master02
[mysqld]
server-id = 20
log-bin = mysql-bin
log-slave-updates = true
relay-log = relay-log-bin
relay-log-index = relay-log-bin.index
3)slave01
[mysqld]
server-id = 30
log-bin = mysql-bin
relay-log = relay-log-bin
relay-log-index = relay-log-bin.index
4)slave02
[mysqld]
server-id = 40
log-bin = mysql-bin
relay-log = relay-log-bin
relay-log-index = relay-log-bin.index
5)分别启动这四台mysql服务器
[root@master01 /]# systemctl restart mysqld
6)数据库中的数据不一致时的操作(基本上以数据最多的为主,在其他数据库中导入这台数据库的所有数据)
mysql> flush tables with read lock; 施加锁,在数据多的一台上配置
mysqldump -uroot -p --opt --all-databases > /root/all-databases.sql 最好另起一个ssh终端,输入此命令,防止锁失效
scp /root/all-databases.sql root@192.168.200.20:/root/ 将数据传输到其他节点上
mysql -uroot -p < /root/all-databases.sql 将传输过来的数据导入数据库中
mysql -uroot -ppwd@123 -e “flush privileges;” 在其他节点上刷新配置
mysql> unlock tables; 若是正在使用的环境中最好是配置完主主或主从复制后在解锁
5、配置主主复制和主从复制
1)主主复制
[root@master01 /]# mysql -uroot -ppwd@123
mysql> grant replication slave on *.* to 'tongbu'@'192.168.200.%' identified by 'pwd@123'; 授权所有服务器复制master01二进制日志的权限
mysql> show master status; 查看master01的日志状态
mysql> change master to master_host='192.168.200.10',master_user='tongbu',master_password='pwd@123',master_log_file='mysql-bin.000001',master_log_pos=411; 在master02中配置
mysql> statr slave; 启动master02的slave
[root@master02 /]# mysql -uroot -ppwd@123
mysql> grant replication slave on *.* to 'tongbu'@'192.168.200.%' identified by 'pwd@123'; 授权所有服务器复制master02二进制日志的权限
mysql> show master status; 查看master02的日志状态
mysql> change master to master_host='192.168.200.20',master_user='tongbu',master_password='pwd@123',master_log_file='mysql-bin.000001',master_log_pos=411; 在master01中配置
mysql> statr slave; 启动master01的slave
2)主从复制
[root@slave01 /]# mysql -uroot -ppwd@123
mysql> change master to master_host='192.168.200.10',master_user='tongbu',master_password='pwd@123',master_log_file='mysql-bin.000001',master_log_pos=411; Slave01中配置
mysql> statr slave; 启动slave01的slave
[root@slave02 /]# mysql -uroot -ppwd@123
mysql> change master to master_host='192.168.200.10',master_user='tongbu',master_password='pwd@123',master_log_file='mysql-bin.000001',master_log_pos=411; Slave02中配置
mysql> statr slave; 启动slave02的slave
3)若出现配置错误需要使用如下命令后在重新配置:
mysql> stop slave; 停止服务
mysql> reset slave; 重置服务
4)检查四台数据库的状态(ip地址,Slave_IO_Running: Yes,Slave_SQL_Running: Yes)
6、安装配置mysql-mmm
1)安装mysql-mmm(五台都需要安装)
[root@master01 ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@master01 ~]# yum -y install epel-release mysql-mmm*
2)修改hosts文件(五台都要配置,内容相同)
[root@master01 /]# vim /etc/hosts
192.168.200.10 master01
192.168.200.20 master02
192.168.200.30 slave01
192.168.200.40 slave02
192.168.200.50 monitor
3)配置mysql-mmm(五台上的配置相同)
[root@master01 /]# vim /etc/mysql-mmm/mmm_common.conf
active_master_role writer
<host default>
cluster_interface ens32 服务器监听的网卡
pid_path /run/mysql-mmm-agent.pid 代理运行的pid
bin_path /usr/libexec/mysql-mmm/ mmm可执行文件的路径
replication_user tongbu 主主和主从复制授权的账户
replication_password pwd@123 授权的密码
agent_user mmm_agent 对其他其他数据库访问本数据库的授权
agent_password pwd@123 授权的密码
</host>
<host master01> Mysql的主机名
ip 192.168. 200.10 Master01的IP地址
mode master 角色属性,master代表主
peer master02 对等的数据库的host名
</host>
<host master02>
ip 192.168.200.20
mode master
peer master01
</host>
<host slave01>
ip 192.168.200.30
mode slave
</host>
<host slave02>
ip 192.168.200.40
mode slave
</host>
<role writer> 角色配置,写入角色
hosts master01,master02 写入的主机名
ips 192.168.200.15 vip地址
mode exclusive 只允许提供一个主的ip地址,便于地址飘移
</role>
<role reader> 角色配置,读取角色
hosts slave01,slave02 读取的主机名
ips 192.168.200.35,192.168.200.45 vip地址
mode balanced 负载均衡
</role>
4)在mysql服务器上配置客户端代理(所有的mysql数据库中)
master01:
[root@master01 /]# vim /etc/mysql-mmm/mmm_agent.conf
this master01
master02:
[root@master02 /]# vim /etc/mysql-mmm/mmm_agent.conf
this master02
slave01:
[root@slave01 ~]# vim /etc/mysql-mmm/mmm_agent.conf
this slave01
slave02:
[root@slave02 ~]# vim /etc/mysql-mmm/mmm_agent.conf
this slave02
[root@master01 /]# systemctl start mysql-mmm-agent.service
[root@master01 /]# systemctl enable mysql-mmm-agent.service
5)配置监控端
[root@monitor ~]# vim /etc/mysql-mmm/mmm_mon.conf
8 ping_ips 192.168.200.10,192.168.200.20,192.168.200.30,192.168.200.40 需要监控的数据库
9 auto_set_online 5
19 <host default>
20 monitor_user mmm_monitor 监控服务器通过这个账户管理数据库
21 monitor_password pwd@123 管理数据库的密码
22 </host>
[root@monitor ~]# systemctl start mysql-mmm-monitor.service
[root@monitor ~]# systemctl enable mysql-mmm-monitor.service
6)配置数据库授权
[root@master01 /]# mysql -uroot -ppwd@123 -e ’ grant all on . to “mmm_agent”@“192.168.200.%” identified by “pwd@123”;’ 授权授权所有数据库都可以查看当前信息,用于故障转移后
[root@master01 /]# mysql -uroot -ppwd@123 -e ’ grant all on . to “mmm_monitor”@“192.168.200.50” identified by “pwd@123”;’ 授权监控服务器监控数据库的状态
7)查看mysql的状态
[root@monitor ~]# mmm_control show
7、配置读写分离
1.安装jdk和amoeba。
1)配置JDK。
[root@amoeba ~]# mkdir /usr/local/jdk
[root@amoeba /]# cp /usr/src/jdk-6u14-linux-x64.bin /usr/local
[root@amoeba local]# ./jdk-6u14-linux-x64.bin
[root@amoeba local]# mv ./jdk1.6.0_14/* ./jdk
2)安装amoeba。
[root@amoeba jdk]# mkdir /usr/local/amoeba
[root@amoeba jdk]# mv /usr/src/conf/* /usr/local/amoeba
3)配置环境变量。
[root@amoeba /]# vim /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/local/jdk
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
export PATH=$PATH:$AMOEBA_HOME/bin
[root@amoeba /]# source /etc/profile
[root@amoeba local]# java -version
2.设置amoeba读写分离账户。
1)设置主mysql允许test账户访问mysql,需要在主从上同时配置。
[root@master /]# mysql -uroot -p
mysql> grant all on . to ‘amoeba’@‘192.168.100.60’ identified by ‘pwd@123’;
2)修改amoeba配置文件配置客户端访问amoeba的账户密码。
[root@amoeba /]# vim /usr/local/amoeba/amoeba.xml
10 <property name="port">8066</property> 客户端访问amoeba的端口
30 <property name="user">client</property> 访问amoeba的账户
32 <property name="password">pwd@123</property> 访问amoeba账户的密码
115 <property name="defaultPool">master</property> 默认写mysql池的名字
116 <property name="writePool">master</property> 写入MySQL数据库的池
117 <property name="readPool">slaves</property> 读取MySQL数据库的池
3)设置amoeba服务器的host文件,添加解析主机名。(在群集中所有的服务器上配置,也可配置DNS,或不配置在后面配置时用ip地址也可以)
[root@amoeba /]# vim /etc/hosts
192.168.100.10 master01
192.168.100.20 master02
192.168.100.30 slave01
192.168.100.40 slave02
192.168.100.50 monitor
192.168.100.60 amoeba
4)修改amoeba的配置文件添加服务器池。
[root@amoeba /]# vim /usr/local/amoeba/dbServers.xml
26 <property name="user">amoeba</property>
27 <property name="password">pwd@123</property>
42 <dbServer name="master" parent="abstractServer">
43 <factoryConfig>
44 <!-- mysql ip -->
45 <property name="ipAddress">192.168.100.15</property>
46 </factoryConfig>
47 </dbServer>
49 <dbServer name="slave01" parent="abstractServer">
50 <factoryConfig>
51 <!-- mysql ip -->
52 <property name="ipAddress">192.168.100.35</property>
53 </factoryConfig>
54 </dbServer>
56 <dbServer name="slave02" parent="abstractServer">
57 <factoryConfig>
58 <!-- mysql ip -->
59 <property name="ipAddress">192.168.100.45</property>
60 </factoryConfig>
61 </dbServer>
64 <dbServer name="slaves" virtual="true">
65 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- Load balancing strategy: 1=ROUNDROBIN(轮询) , 2=WEIGHTBASED(权重) , 3=HA-->
66 <property name="loadbalance">1</property>
67 <property name="poolNames">slave01,slave02</property>
68 </poolConfig>
69 </dbServer>
5)启动amoeba。
[root@amoeba /]# amoeba start&
[root@amoeba /]# netstat -anptu | grep 8066
[root@amoeba /]# netstat -anptu | grep java
6)客户端登录到数据库。
[root@Centos ~]# mysql -u client -p -h 192.168.100.60 -P 8066
7)测试
当只开启两个从时,使用(select)测试读取数据
当之开启两个主时,使用(create)测试写入数据