前言:
从装数据库开始到实现主从同步加读写分离,只要有点儿linux基础都能实现,but,此教程能够让你配置读写分离,但是更深层的技术还是得需要花更多的时间去看其他的技术文章。
环境:
系统:Centos7
主库:172.16.100.69 mysql5.7 master
从库:172.16.100.70 mysql5.7 slave
中间件:172.16.100.71 mycat-1.6
中间件环境:jdk1.8以上
功能:
主库与从库:主从同步
中间件:读写分离
步骤:
1、安装主从mysql数据库
2、配置主从mysql数据库
3、安装mycat与JDK
4、配置测试mycat
5、mycat性能调优
备注:
安装前请在主库、从库、中间件服务器上执行以下命令,关闭防火墙以及壳机制。(当然,你也可以选择不关闭防火墙,但需要配置防火墙规则)
[root@slave ~]# sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config
[root@slave ~]# systemctl stop firewalld
[root@slave ~]# systemctl disable firewalld
说实话,这俩b玩意儿一般都是关闭了的。
1、安装mysql主从数据库。
主库:172.16.100.69 、从库:172.16.100.70 上执行以下命令
安装相关工具
yum -y install epel-release wget git vim
wget获取mysql-5.7 rpm安装包
wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
yum安装mysql-5.7 rpm安装包
yum -y install mysql57-community-release-el7-10.noarch.rpm
yum安装mysql-5.7服务端
yum -y install mysql-community-server
启动mysql-5.7 服务端
systemctl start mysqld.service
开机自动启动mysql-5.7 服务端
systemctl enable mysqld.service
查看mysql-5.7 服务器运行状态
systemctl status mysqld.service
首次登录mysql,需要在mysql日志里面获取系统随机生成的root密码
grep "password" /var/log/mysqld.log
首次登录mysql,自动在mysql日志里面获取root密码 这里看不懂没关系可跳过此步骤
mysql_password=$(cat /var/log/mysqld.log | grep "password is generated for root@localhost:" | awk -F ' ' '{print $NF}')
mysql -uroot -p${mysql_password}
进入mysq-5.7,注意,因为我获取到这个随机密码是带有特殊符号的所以必须在密码外面加单引号 'C&sqB_:Gr7F3'
mysql -uroot -p'C&sqB_:Gr7F3'
输入初始密码,此时不能做任何事情,因为MySQL默认必须修改密码之后才能操作数据库
mysql> show databases;
但是新密码设置的时候如果设置的过于简单会报错,所以我们先去修改一下安全机制,降低一下级别,让其可以接受简单密码
mysql> set global validate_password_policy=0;
mysql> set global validate_password_length=1;
修改密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'lanyi123';
上面条只能用于本地登录,继续设置让其远程可登录
mysql> grant all on *.* to root@'%' identified by 'lanyi123';
刷新以下配置,让其重启mysql后也生效
mysql> flush privileges;
但此时还有一个问题,就是因为安装了Yum Repository,以后每次yum操作都会自动更新,需要把这个卸载掉:
yum -y remove mysql57-community-release-el7-10.noarch
至此mysql安装完成。✔
2、配置主从mysql数据库。
2.1配置主数据库
在/etc/my.cnf 文件中的[mysqld]下面加入以下几行
[root@master ~]# vim /etc/my.cnf
[mysqld]
log_bin=master69
server_id=69
binlog_format="mixed"
重启刷新配置文件
[root@master ~]# systemctl restart mysqld
mysql> show master statusG; #查看主库master状态,查看当前使用的binlog日志文件
创建一个用户给从库做同步数据用 (我这里创建的是用户是 “ms” 密码为”ms100200”)
mysql> grant replication slave on *.* to ms@'%' identified by 'ms100200';
至此mysql主库配置完成。✔
2.2配置从数据库与两端的连接
在/etc/my.cnf 文件中的[mysqld]下面加入以下几行
[root@slave ~]# vim /etc/my.cnf
[mysqld]
server_id=70
重启刷新配置文件
[root@slave ~]# systemctl restart mysqld
进入mysql 配置从库连接信息
mysql> change master to
-> master_host='172.16.100.69',
-> master_user='ms',
-> master_password='ms100200',
-> master_log_file='master69.000001', #与主库binlog日志名相同
-> master_log_pos=1567; #偏移量,与主库相同
Query OK, 0 rows affected, 2 warnings (0.02 sec)
注意:任意参数指定不对,io线程读取不了任何信息
启动slave(io,sql线程)
mysql> start slave;
查看连接状态
mysql> show slave statusG;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.100.69
Master_User: ms
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master69.000001
Read_Master_Log_Pos: 1567
Relay_Log_File: slave-relay-bin.000002
Relay_Log_Pos: 319
Relay_Master_Log_File: master69.000001
Slave_IO_Running: Yes #看到yes就成功了
Slave_SQL_Running: Yes #ok了
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1567
Relay_Log_Space: 526
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 69
Master_UUID: 877926e5-3822-11ea-adcc-2eeb0209f909
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
查如果看到上面io与sql两个状态为yes的话就成功了
接下来进行测试查看是否确实能够实现主从同步
在master主库上操作创建一个名叫test的数据库
mysql> create database test ;
Query OK, 1 row affected (0.01 sec)
接下来去slave从库上查看常见的test数据库是否有无被同步过来
mysql> show databases ;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)
配置从数据库与两端的连接 ✔
3、安装mycat与JDK
以下命令在172.16.100.71 mycat服务器上执行
以下命令在172.16.100.71 mycat服务器上执行
以下命令
3.1获取mycat1.6与jdk-1.8
cd /opt
wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
获取 jdk 安装包,如果获取此安装包过慢,请前往官网下载(官网下载需要注册账户等比较麻烦)
wget http://erge1998.cn/file/jdk-8u20-linux-x64.tar.gz
解压安装包
tar -zxvf /opt/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
mkdir -p /usr/java
tar -zxvf /opt/jdk-8u20-linux-x64.tar.gz -C /usr/java/
设置环境变量 (注意,如果你下载的jdk的版本跟我不一样的话,下面的位置你根据你的实际情况改一下,比如我下载的是jdk1.8.0_20版本,那么相应的位置我就应该填jdk1.8.0_20)
echo "JAVA_HOME=/usr/java/jdk1.8.0_20 PATH=$JAVA_HOME/bin:$PATH CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar export PATH JAVA_HOME CLASSPATH" >> /etc/profile
echo "MYCAT_HOME=/usr/local/mycat PATH=$MYCAT_HOME/bin:$PATH" >> /etc/profile
加载一下配置文件
source /etc/profile
检测java是否安装成功(为什么说是安装成功,因为JDK解压了就可以直接运行,我们这里只是为了方便设置环境变量 不用非要到jdk指定目录下才能运行)
java -version
检测mycat是否安装成功,使用netstat -unlpt命令来查看端口9066 与8066 是否开启
netstat -unlpt
至此mycat与jdk安装完成。✔
3.1配置mycat读写分离
进入mycat的配置目录,此文件下有很多配置文件
cd /usr/local/mycat/conf
ls
目前我们实现简单的读写分离,只需配置schema.xml server.xml 两个文件即可。
配置mycat读写分离,养成良好习惯,配置之前先备份
cp schema.xml schema.xml.bak
cp server.xml server.xml.bak
接下来会比较难,文字可能会不太好表达其含义,这里(这个需要去搜一下教学教学视频,51cto腾讯课堂上都去找找,主要是去理解这个配置文件的涵义。多插一句,这里并不是打广告,即使你去看了教学视频也不一定能配好,我这里只是整理了一条比较通畅的路)
vim schema.xml
将原来的server.xml清空,然后插入我这里的代码
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="test" checkSQLschema="false" sqlMaxLimit="100" dataNode="logical_db1">
</schema>
<!--schema name="test" checkSQLschema="false" sqlMaxLimit="100" dataNode="logical_db1">
<schema/> -->
<dataNode name="logical_db1" dataHost="Mycat-node" database="test" />
<dataHost name="Mycat-node" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>show slave status</heartbeat>
<writeHost host="master" url="172.16.100.69:3306" user="root" password="lanyi123">
<readHost host="alave" url="172.16.100.70:3306" user="root" password="lanyi123">
</readHost>
</writeHost>
</dataHost> </mycat:schema>
接下来改server.xml文件
vim server.xml
将此处的配置要与schema.xml中的所让用户看到的数据库名一致
配置完成,重启mycat
mycat restart
至此mycat读写分离配置完成 ✔