1.环境准备:
服务器centos7.2.5: 172.18.113.37(主) 172.18.113.38(从)两台
数据库mysql-5.7.25:
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz
数据库中间件mycat-1.6.7.1:
wget http://dl.mycat.io/1.6.7.1/Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gz
yum mysql数据依赖的libaio 库
yum search libaio
yum install libaio
2.mysql安装:
a.添加mysql组:
groupadd mysql
b.添加mysql组mysql用户:
useradd mysql -g mysql
c.上传mysql包至该路径 :
cd /home/mysql;
解压:tar -zxvf MySQL-5.7/mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz
更改目录名称:mv ./mysql-5.7.25-linux-glibc2.12-x86_64/ ./mysql
解压目录结构:
d.初始化mysql:
bin/mysqld --initialize --user=mysql
e.添加到MySQL 启动脚本到系统服务
cp support-files/mysql.server/etc/init.d/mysql.server
f.启动MySQL服务
启动方式一:bin/mysqld_safe --user=mysql &
启动方式二:service mysql.server start 或者 /support-files/mysql.server start
如若出现报错:mysqld_safe error: log-error set to '/var/log/mariadb/mariadb.log', however file don't exists. Create writable for user 'mysql'. ERROR! The server quit without updating PID file (/var/lib/mysql/node1.pid).
给日志目录授予读写权限:
$ mkdir /var/log/mariadb
$ touch /var/log/mariadb/mariadb.log
$ chown -R mysql:mysql /var/log/mariadb
g.登陆mysql:
mysql免密登陆:vim /etc/my.cnf
在[mysqld] 下面新增一行skip- grant-tables
登陆报错:
bin/mysql -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server
through socket '/tmp/mysql.sock' (2)
故障分析
查看mysql实例的状态
$ netstat -ntlp | grep 3306tcp6 0 0 :::3306 :::* LISTEN 10794/mysqld
查看my.cnf关于socket的配置
$ more /etc/my.cnf |grep sock socket=/var/lib/mysql/mysql.sock
解决方法,修改/etc/my.cnf
$ vi /etc/my.cnf
修改 [mysqld]组下的 socket 路径,我是选择注释掉,加一行为
tmp/mysql.soc
[mysqld]
datadir=/var/lib/mysql
#socket=/var/lib/mysql/mysql.sock
socket=/tmp/mysql.sock
h.重启MySQL 服务
$ service mysql.server start
$Shutting down MySQL.. SUCCESS!
i.设置MySQL密码
mysql> use mysql;
mysql> update user set host='%',authentication_string
=password("mima") where user='root';
mysql> flush privileges;
mysql> grant all privileges on *.* to 'root'@'%' identified by
'mima' with grant option;
mysql> flush privileges;
mysql> exit;
j.去除免密登陆脚本,
skip-grant-tables
使用最高权限root用
户登陆数据库
3.mysql主主复制,双向主备,高可用分布式数据库方案
原理:主主复制在两台MySQL互为主从,它们都可以变更数据,其中一台变更了数据另外一台也会同步相应的变更。
1.两台mysql都可读写,互为主备,默认只使用一台(masterA)负责数据的写入,另一台(masterB)备用。
2.masterA是masterB的主库,masterB又是masterA的主库,它们互为主从。
a.准备工作
搭建mysql见步骤2
Mysql版本:MySQL 5.7.25
Master-Server : 172.18.113.37
Slave-Server : 172.18.113.38
b. Master-Server 配置
修改 my.cnf
配置 Master 以使用基于二进制日志文件位置的复制,必
须启用二进制日志记录并建立唯一的服务器ID,否则则无
法进行主从复制。
停止MySQL服务。
开启binlog ,每台设置不同的 server-id
$ service mysql.server stop
$ cat /etc/my.cnf
[mysqld]
log-bin=mysql-bin
server-id=37
启动mysql配置 创建拥有REPLICATION SLAVE权限的用户,从库可以使用该用户连接进行数据复制(指定到只有从库可以连接)
$ /usr/local/mysql/bin/mysql -uroot -p
mysql> CREATE USER 'replication'@'172.18.113.38'
IDENTIFIED BY 'mima';
mysql> GRANT REPLICATION SLAVE ON *.* TO
'replication'@'172.18.113.38';
c.Slave-Server 配置
修改 my.cnf 停止MySQL服务,每个server-id都必须唯一,一般以ip后两位
$ service mysql.server stop
$ cat /etc/my.cnf
[mysqld]
server-id=38
启动登录MySQL服务
$ service mysql.server start
$ /home/mysql/bin/mysql -uroot -p
d配置主库通信
登陆主库查看 Master-Server , binlog File 文件名称和 Position值位置 并且记下来
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000015 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
登陆从库配置刚才步骤b在主库配置的拥有复制权限的replication用户
执行如下语句:MASTER_LOG_POS
给0也没问题
mysql> CHANGE MASTER TO
-> MASTER_HOST='172.18.113.37',
-> MASTER_USER='replication',
-> MASTER_PASSWORD='mima',
-> MASTER_LOG_FILE='mysql-bin.000015 ',
-> MASTER_LOG_POS=154 ;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
启动从服务器复制线程
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
查看复制状态
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.18.113.37
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000015
Read_Master_Log_Pos: 154
Relay_Log_File: master2-relay-bin.000003
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
......
检查主从复制通信状态
Slave_IO_State
#从站的当前状态
Slave_IO_Running
: Yes #读取主程序二进制日志的I/O线程是否正在运行
Slave_SQL_Running
: Yes #执行读取主服务器中二进制日志事件的SQL线程是否正在运行。与I/O线程一样
Seconds_Behind_Master
#是否为0,0就是已经同步了
e.注意事项!!
如果需要配置双向主从,服务器反过来执行一遍
主从复制会从服务器通过I/O
线程从主服务器中通过中继日志同步变更过的数据到从服务器,所以需要保证I/O
线程的通畅也就是Slave_SQL_Running
必须一直处于yes
状态 否则无法完成同步
从服务器默认会同步主服务器中所有的变更数据库信息 有时候我们却只需要同步我们想要的数据库信息 这时可以配置一下Replicate_Do_DB
属性指定需要同步的数据库
vim /etc/my.cnf
[mysqld]
replicate-do-db=ensen_db1
replicate-do-db=ensen_db2
replicate-do-db=ensen_db3
4.mycat中间件搭建,实现读写分离,分表分库
a.环境
MySql-Master:172.18.113.37
MySql-Slave:172.18.113.38
Mycat:172.18.113.37
b.MySql 主从复制
见步骤3
c.在主库172.18.113.37建库 测试主从复制是否可用
CREATE DATABASE `ensen_db1`;
CREATE DATABASE `ensen_db2`;
CREATE DATABASE `ensen_db3`;
d.安装 JDK
由于mycat是使用java开发的中间件 所以需要jdk的支持
未安装的请先自行安装好jdk1.8以上版本然后再往下操作
e.搭建mycat
上传步骤1下载好的
Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gz
包至/home/mysql/
目录
解压:tar -zxvf Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gz
得到mycat目录
配置mycat环境变量
vim /etc/profile
export PATH=${JAVA_HOME}/bin:${MYCAT_HOME}/lib:$PATH
export MYCAT_HOME=/home/mysql/mycat/
source /etc/profile
进入mycat/conf目录编辑wrapper.conf
# Java Application
wrapper.java.command=你的jdk安装目录
wrapper.working.dir=..
f.配置 Mycat
本文只是简单配置在不同的服务器上进行读写分离只需要配置两个文件 server.xml 和 schema.xml
schema.xml 中定义逻辑库,表、分片节点等内容
rule.xml 中定义分片规则
server.xml 中定义用户以及系统相关变量,如端口等
关于ER分片策略的两种情况分析:
a.父表按照主键ID分片,子表的分片字段与父表的ID进行关联,配置为ER分片,子表插入直接使用父表的分片规则,如果没有外键的约束即使子表在父表找不到相应的数据,也能插入成功,只要分片规则中有所定义。所以对于这种情况,子表在插入数据时候不会去判断主表中是否存在关联的数据,而是直接根据主表的分片规则进行插入操作
b.父表分片字段为其他字段,子表的分片字段与父表的ID进行关联,配置为ER分片,这种情况子表插入会依次到各个节点中去寻找,直到找到对应的节点,否则会报can't find (root) parent sharding node for sql
找不到父分片节点
g.启动 Mycat
cd /home/mysql/mycat/bin
./mycat start
启动mycat
./mycat stop
停止mycat
./mycat status
查看mycat状态
./mycat restart
重启mycat
h.查看日志
启动 mycat 的日志
tail -f /home/mysql/mycat/logs/wrapper.log
访问 mycat 的日志
tail -f/home/mysql/mycat/logs/mycat.log
i.Mycat的使用
登录 Mycat 客户端
mysql -uroot -p -h密码 172.18.113.37 -P 8066
mysql> show databases;
mysql> use test_schema;
mysql> use tables;
登录 Mycat 管理端
mysql -uroot -p密码 -h172.18.113.37 -P 9066