MySQL互为主从 FEDERATED引擎实现多路径写入功能Mysql写负载均衡
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Mysql互为主从+FEDERATED 实现写负载均衡
Edit by 笑天涯 Q:280916071
环境规划:
机器名操作系统IP 角色
MySQL01 CentOS5.6 32bit 10.1.1.70 Master—>slave MySQL02 CentOS5.6 32bit 10.1.1.80 Slave—>master
1、概述:
Mysql主重复制多用在数据库容灾,读写分离方面,因互为主从结构在高并发下各自自增键生成的ID 可能导致主键冲突,所有一般的结构式一主多重结构如图一:
图1 图二
而是用双主或多主并是用全局唯一ID生成机制的结构如图2
在图一中master节点是这个系统的写操作最频繁的节点,如果该节点出现故障则新的订单将无法写入库,可以采用淘宝是用的多系统拆策略,将不同系统的数据库独立,每个系统单独一个主从结构体。
但是采用多主相互复制的结构,可以负载均衡写操作,实现多个写入口加多个读出口,提示系统的并发链接数量。
2、安装主要操作
(1)、系统安装略过
(2)、mysql安装:
本实验使用的mysql版本是mysql-5.5.34.tar.gz 、cmake版本是cmake-2.8.4.tar.gz,其他依赖包采用yum安装。
1创建mysql用户和组:
Groupadd mysql && useradd mysql
passwd mysql 修改mysql密码
2编译安装cmake 略
3编译安装mysql :
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql/ \
-DMYSQL_DATADIR=/home/mysql \
-DWITH_DEBUG=0 \
-DDEFAULT_CHARSET=utf8 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DMYSQL_TCP_PORT=3306 \
-DMYSQL_USER=mysql \
-DMYSQL_UNIX_ADDR=/home/mysql/mysql.sock \
-DINSTALL_PLUGINDIR=/usr/local/mysql/plugin
-with-plugins=federated
编译完成后就直接make && make install
然后运行脚本mysql_install_db、设置为服务,放置f到/etc
注:f中服务器配置下需新增一行 federated=1 ,该引擎默认是关闭的,然后重启服务
3、主从配置
在master1 的f中确认以下选项,如果没有则添加
binlog-bin = mysql-bin
server-id = 1
replicate-do-db = zhw --制定复制的数据库
配置完后重启服务
在从端的f中确认以下选项,如果没有则添加
binlog-bin = mysql-bin
server-id = 2
binlog-do-db = zhw --制定复制的数据库
配置完后重启服务
--添加用于从端复制的用户和权限
grant replication slave on *.* to 'repl'@'10.1.1.70' identified by '123';
--在从端sqlcmd中通过如下语句连接上主端(注意 ip、用户名、密码、文件、位置)
change master to master_host='10.1.1.80',master_user='repl',master_password='123', master_log_file='mysql-bin.000009' ,master_log_pos=107;
因是互为主从,所有在2台服务器上交换再次操作。
4、配置FEDERATED 表
在mysql 中执行:
show engines\G;
可看到FEDERATED 引擎是yes则可用。
在MySQL01 test库中创建表:
Create table getid(maxid bigint not null,uname varchar(30))engine=Innodb;
这个是普通的innodb表,用于记录数据库的最大ID当前值,该表非常重要,需经常做备份。
在MySQL02 的test库中创建表:
Create table getid(maxid bigint not null,uname varchar(30))engine=FEDERATED CONNECTION=’mysql://repl:123@10.1.1.70:3306/test/getid’ ;
该表是MySQL01中的id最大表在MySQL02上的映射可像本地宝一样操作。
创建获取过程:
CREATE PROCEDURE `get_id`(
in in_uname VARCHAR(30), --该表可配置多个选项
out out_ActorID BIGINT
)
BEGIN
start TRANSACTION;
update test.getid --更新最大值
set maxid=maxid+1
where uname=in_uname;
select maxid into out_ActorID from test.getid where uname=in_uname; --返回最大值
COMMIT;
end
5、测试:
在zhw库中创建表
Create table GameActor(ActorID bigint not null,uname varchar(30) not null);
该表用来保存角色的ID和角色名,因角色ID 需全局唯一,所以需要唯一机制创建角色ID
创建角色过程:
CREATE PROCEDURE `CreateActor`(
in in_ActorName VARCHAR(30)
)
BEGIN
DECLARE n bigint;
call test.get_id('ActorID',n);
insert into zhw.GameActor values(n,in_ActorName);
COMMIT;
END。