# MYSQL集群搭建详解(3台机器)一主多从
2017/10/24 14:17:01
## 1. 集群配置如下
<pre>
主节点:192.168.11.129
从节点1:192.168.11.130
从节点2:192.168.11.131
</pre>
## 2. 主,从节点安装(192.168.5.14/15/16)
<pre>
见《mysql源码版本安装教程》
</pre>
## 3. 配置主节点
<pre>
vi my.cnf 添加以下内容
[mysqld]
server-id=1 #设置主服务器的ID(每台不一样)
innodb_flush_log_at_trx_commit=1 #自行百度
sync_binlog=1 #开启binlog日志同步功能
log-bin=mysql-bin-1 #binlog日志文件名
binlog-do-db=test # 这个表示只同步某个库 (如果没有此项,表示同步所有的库)
binlog-ignore-db=mysql #要忽略的数据库
</pre>
### 3.1 在主数据库里创建一个同步账号
mysql> CREATE USER 'mycat'@'192.168.5.%' IDENTIFIED BY '123456';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'mycat'@'192.168.5.%';
### 3.2 查看 主节点状态
配置完重启mysql之后
shell> show master status;
![](https://i.imgur.com/QDtmTbT.png)
<pre>提示1:如果你不配置server-id或者配置值为0,那么主服务器将拒绝所有从服务器的连接。
提示2:在使用InnoDB的事务复制,为了尽可能持久和数据一致,你应该在my.cnf里配置<br>innodb_flush_log_at_trx_commit=1 和 sync_binlog=1;For the greatest possible<br> durability and consistency in a replication setup using InnoDB with transactions, you <br>should useinnodb_flush_log_at_trx_commit=1 and sync_binlog=1 in the master my.cnf file.
提示3:确保主服务器里的skip-networking选项未启用,如果网络被禁用,你的从服务器将不<br>能与主服务器通信并且复制失败。
</pre>
## 4. 从节点配置
<pre>
[mysqld]
server-id=2
#在master端不指定binlog-do-db,在slave端用replication-do-db来过滤
#replicate-do-db = test
#replicate-ignore-db = mysql #忽略的库
#我看网上还有下面的配置
#relay-log=mysqld-relay-bin
log-bin=mysql-bin-2 #配置在这里可以作为其他机器的主节点
</pre>
提示1:如果有多个从服务器,每个服务器的server-id不能重复,跟IP一样是唯一标识,如果你没设置server-id或者设置为0,则从服务器不会连接到主服务器。
提示2:一般你不需要在从服务器上启用二进制日志,如果你在从服务器上启用二进制日志,那你可用它来做数据备份和崩溃恢复,或者做更复杂的事情(比如这个从服务器用来当作其它从服务器的主服务器)。
### 4.1 配置连接主服务器的信息
配置前 重启mysql服务
mysql> stop slave;
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.5.16',
-> master_port=3307,
-> MASTER_USER='mycat',
-> MASTER_PASSWORD='123456',
-> MASTER_LOG_FILE='mysql-bin.000004',
-> MASTER_LOG_POS=1704;
mysql> start slave;
### 4.2 查看从服务器状态
mysql> show slave status \G;
![](https://i.imgur.com/p2qVIYX.png)
## 5. 遇到问题
### 5.1 slave_io_running:no
我出现的原因:(看日志) because master and slave have equal MySQL server UUIDs
解决办法:/data/auto.cnf 文件里面的值在三台服务器都是一样的,改掉从服务器zuto.cnf文件名,重启从服务器mysql得到解决。
其余可能看网上说法,基本都是一个套路。科科
## 6. 功能测试
<pre>
自己在navcat上操作(建表,插入删除更新等等)
停掉从服务器,继续操作,在启动从服务器看是否同步
</pre>
## 7. 部署 mycat
### 7.1 补充
<pre>
(1) MySQL主从复制配置中,如果涉及到函数或存储过程的同步复制,需要在/etc/my.cnf中的[mysqld]段中增加配置log_bin_trust_function_creators=true 或在客户端中设置 set global log_bin_trust_function_creators = 1;
(2) 如果要做读写分离下的主从切换,那么从节点也有可能会变为写节点,因此从节点就不能设置为只读 read_only=1 。
(3) Linux版本的MySQL,需要设置为MySQL大小写不敏感,否则可能会发生找不到表的问题。可在/etc/my.cnf的[mysqld]段中增加lower_case_table_names=1 。
</pre>
### 7.2 配置MyCat的schema.xml(用于设置MyCat的逻辑库、表、数据节点、dataHost等内容)
<!-- 定义MyCat的逻辑库,逻辑库的概念与MySQL中的 database 概念相同 -->
<schema name="masterTest" checkSQLschema="false" sqlMaxLimit="100" dataNode="master"></schema> //注意:masterTest是数据库的名称,这个是mycat的的数据库名称
<dataNode name="master" dataHost="masterDataHost" database="test" /> //database是数据库连接的数据库
<dataHost name="masterDataHost" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.5.16:3306" user="root" password="123" > //注意:这里是登录数据库的用户和密码,跟mycat没关系
<readHost host="hostS1" url="192.168.5.14:3306" user="root" password="123" weight="1" />
<readHost host="hostS2" url="192.168.5.15:3306" user="root" password="123" weight="1" />
</writeHost>
</dataHost>
### 7.3 配置MyCat的server.xml
<pre>
没有特殊要求,就只新加自定义账户密码,自带文件里面有格式。
这里是登录mycat的账号和密码
<user name="root">
<property name="password">root123</property>
<property name="schemas">masterTest</property>
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="masterTest" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
</pre>
### 7.4 启动
shell> mycat start
shell> mycat conslole #这个debug模式用户初次安装启动,查看信息
查看日志文件命令,解决主从同步失败的方式
bin/mysqlbinlog --start-position=443 logs/mysql-bin-1.000011
bin/mysqlbinlog logs/mysql-bin-1.000011 > /home/noteapp/mysql/logs/test.log
CHANGE MASTER TO
MASTER_HOST='192.168.11.129',
master_port=3306,
MASTER_USER='root',
MASTER_PASSWORD='root123',
MASTER_LOG_FILE='mysql-bin.000018',
MASTER_LOG_POS=120;
Slave_IO_Running为no,两个原因(1)mysql-bin.xxx跟主的配不上
进入mysql的数据库里面。
stop slave
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000019', MASTER_LOG_POS=120; 注意120就是分区数,查看主的status里面的那个数值。
(2)data文件夹下面的auto.cnf里面UUID与主的一样了,这里修改一下。