- MySQL主从复制和读写分离、
1.
1)MySQL主从复制作用
避免单节点故障
保证数据库的可靠性
2)MySQL可靠性解决方案
主从复制
主主复制
Mysql MHA
Mysql MM
Mysql 双机热备
2.MySQL读写分离
1)MySQL读写分离的作用
加快用户访问速度
增加访问并发量
2)读写分离方式
Mysql proxy: 需要二次开发,使用复杂
Amoeba:java语言编写,配置简单实用方便
3.MySQL主从的原理和复制的类型
1)MySQL主从复制的原理
开启二进制日志功能
从MySQL服务器监听主MySQL复制二进制日志变化复制到本地
从MySQL读取主MySQL日志应用主MySQL日志从而保证数据库状态的一致性
2)MySQL的复制类型
基于语句的复制
基于行的复制
混合的复制类型
- 配置主从复制
- 配置NTP服务器
```c
vim /etc/ntp.conf
18 restrict 192.168.100.0 mask 255.255.255.0 nomodify notrap //允许哪个网站来同步时间
19 server 127.127.1.0 //服务器是自己
20 fudge 127.127.1.0 stratum 8 //时区
```
- 启动服务并设置开机自启
```c
[root@centos01 ~]# systemctl start ntpd
[root@centos01 ~]# systemctl enable ntpd
Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to /usr/lib/systemd/system/ntpd.service.
```
- 从服务器同步时间
[root@centos02 ~]# ntpdate 192.168.100.10
[root@centos03 ~]# ntpdate 192.168.100.10
[root@centos04 ~]# ntpdate 192.168.100.10
## 进行安装编译MySQL
### 主从节点安装MySQL
```c
[root@centos01 ~]# mount /dev/sr0 /mnt
[root@centos01 ~]# yum -y install ncurses-devel cmake
[root@centos01 ~]# mount /dev/sr1 /mnt
[root@centos01 ~]# tar zxf mysql-5.5.22.tar.gz -C /usr/src/
[root@centos01 ~]# cd /usr/src/mysql-5.5.22/
[root@centos01 mysql-5.5.22]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc
[root@centos01 mysql-5.5.22]# make && make install
```
## 主从节点优化调整
```c
[root@centos01 mysql-5.5.22]# cp support-files/my-medium.cnf /etc/my.cnf
[root@centos01 mysql-5.5.22]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@centos01 ~]# chmod +x /etc/rc.d/init.d/mysqld
[root@centos01 ~]# chkconfig --add mysqld
[root@centos01 ~]# chkconfig --level 35 mysqld on
[root@centos01 ~]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
[root@centos01 ~]# source /etc/profile
```
## 初始化数据库
```c
[root@centos01 ~]# groupadd mysql
[root@centos01 ~]# useradd -M -s /sbin/nologin mysql -g mysql
[root@centos01 ~]# chown -R mysql:mysql /usr/local/mysql/
[root@centos01 ~]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/
```
## 启动MySQL
```c
[root@centos01 ~]# systemctl restart mysqld
[root@centos01 ~]# mysqladmin -u root password 'pwd@123'
```
### 修改MySQL主配置文件(centos01)
```c
1)修改配置文件
[root@centos01 ~]# vim /etc/my.cnf
:%g/^$/d //删除空行
:%g/^#/d //删除注释行
16 log-bin=mysql-bin //开启二进制日志
18 server-id = 10 //设置mysql服务器ID
19 log-slave-update=true //开启日志复制功能
2)重新启动mysql服务加载配置文件
[root@centos01 ~]# systemctl restart mysqld
```
### 修改从mysql从配置文件(centos02、centos03)
```c
[root@centos02 03 ~]# vim /etc/my.cnf
:%/^$/d //删除空行
:%/^#/d //删除注释行
16 log-bin=mysql-bin
18 server-id = 20
19 relay-log=relay-log-bin
20 relay-log-index=slave-relay-bin.index
```
记得重启服务
```c
[root@centos02 03 ~]# systemctl restart mysqld
```
## 配置主从复制
### 配置主服务器centos01
```c
1)创建主从复制账户
[root@centos01 ~]# mysql -uroot -ppwd@123
mysql> grant replication slave on *.* to 'slave'@'192.168.100.%' identified by 'pwd@123';
2)查看指定用户权限信息
mysql> select user,host from mysql.user where user='slave';
3)查看主mysql状态
mysql> show master status;
```
### 配置从服务器centos02
1)配置从mysql数据库复制账户
[root@centos02 ~]# mysql -uroot -ppwd@123
mysql> change master to master_host='192.168.100.10',master_user='slave',master_password='pwd@123',master_log_file='mysql-bin.000002',master_log_pos=257;
2)启动从数据库复制进程
mysql> start slave;
3)查看从mysql复制状态
mysql> show slave status\G;
### 配置从服务器centos03
1)配置从mysql数据库复制账户
[root@centos03 ~]# mysql -uroot -ppwd@123
mysql> change master to master_host='192.168.100.10',master_user='slave',master_password='pwd@123',master_log_file='mysql-bin.000002',master_log_pos=257;
2)启动从数据库复制进程
mysql> start slave;
3)查看从mysql复制状态
mysql> show slave status\G;
## 验证主从复制效果
1)在主服务器(centos01)上创建数据库
[root@centos01 ~]# mysql -uroot -ppwd@123
mysql> show databases;
mysql> create db_test;
mysql> show databases;
2)在从服务器(centos02,centos03)上分别查看数据库,如果显示数据库相同,则主从复制成功,否则失败
[root@centos02 ~]# mysql -uroot -ppwd@123
mysql> show databases;
[root@centos03 ~]# mysql -uroot -ppwd@123
mysql> show databases;
# MySQL读写分离
## 修改映射文件(centos01,centos02,centos03,centos04,centos05)
vim /etc/hosts
192.168.100.10 master
192.168.100.20 slave01
192.168.100.30 slave02
192.168.100.40 amoeba
## 安装JDK和amoeba(centos04)
```c
1)解压JDK
[root@centos04 ~]# mount /dev/sr1 /mnt
[root@centos04 ~]# cp /mnt/jdk-6u14-linux-x64.bin ./
[root@centos04 ~]# ./jdk-6u14-linux-x64.bin
2)移动JDK位置
[root@centos04 ~]# mv jdk1.6.0_14/ /usr/local/java
3)创建amoeba配置文件并解压
[root@centos04 ~]# mkdir /usr/local/amoeba
[root@centos04 ~]# tar zxf /mnt/amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
4)配置环境变量
[root@centos04 ~]# vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/local/java
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib/:$JAVA_HOME/jre/bin:$PATH:$HOME/bin/
export AMOEBA=/usr/local/amoeba
export PATH=$PATH:$AMOEBA/bin
[root@centos04 ~]# source /etc/profile.d/java.sh
5)查看jdk版本
[root@centos04 ~]# java –version
```
3、配置读写分离
1)创建amoeba访问mysql数据库读写分离帐户(centos01)
[root@centos01 ~]# mysql -uroot -ppwd@123
mysql> grant all on *.* to 'write'@'192.168.100.%' identified by 'pwd@123';
2)修改amoeba配置文件设置登录amoeba账户(centos04)
[root@centos04 ~]# cp /usr/local/amoeba/conf/{amoeba.xml,amoeba_xml.bak}
[root@centos04 ~]# vim /usr/local/amoeba/conf/amoeba.xml
10 <property name="port">8066</property> //访问amoeba端口
27 <property name="user">amoeba</property> //登录amoeba账户
28 <property name="password">pwd@123</property> //登录amoeba密码
111 <property name="defaultPool">master</property>
113 <property name="writePool">master</property> //主mysql
114 <property name="readPool">slaves</property> //读取组名字slaves
115 <property name="needParse">true</property>
3)修改配置文件添加读写节点(centos04)
[root@centos04 ~]# cp /usr/local/amoeba/conf/{dbServers.xml,dbServers_xml.bak}
[root@centos04 ~]# vim /usr/local/amoeba/conf/dbServers.xml
19 <property name="port">3306</property> //amoeba访问mysql端口
22 <property name="user">write</property> //amoeba访问mysql账户
23 <property name="password">pwd@123</property> //amoeba访问mysql密码
38 <dbServer name="master" parent="abstractServer">
39 <factoryConfig>
40 <property name="ipAddress">192.168.100.10</property>
41 </factoryConfig>
42 </dbServer>
43
44 <dbServer name="slave01" parent="abstractServer">
45 <factoryConfig>
46 <property name="ipAddress">192.168.100.20</property>
47 </factoryConfig>
48 </dbServer>
49
50 <dbServer name="slave02" parent="abstractServer">
51 <factoryConfig>
52 <property name="ipAddress">192.168.100.30</property>
53 </factoryConfig>
54 </dbServer>
55 <dbServer name="slaves" virtual="true">
56 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
57 <property name="loadbalance">1</property>
58 <property name="poolNames">slave01,slave02</property>
59 </poolConfig>
60 </dbServer>
4)启动amoeba服务
[root@centos04 ~]# /usr/local/amoeba/bin/amoeba start&
4、配置mysql客户端
1)安装mysql客户端
[root@centos05 ~]# mount /dev/sr0 /mnt
[root@centos05 ~]# yum -y install mariadb
2)登录amoeba
[root@centos05 ~]# mysql -h 192.168.100.40 -P8066 -uamoeba -ppwd@123
MySQL [(none)]> create database xsh;
MySQL [(none)]> create table xsh.student (姓名 char(5),性别 char(3),电话号码 char(11));
MySQL [(none)]> insert into xsh.student values ('bob','男','12345678901');