Linux下Mysql主从复制及Mycat读写分离配置

转自http://blog.csdn.net/jaysonhu/article/details/52858535

mysql安装

  1. 下载mysql

  2. 解压
    tar -zxvf mysql-5.6.32-linux-glibc2.5-x86_64.tar.gz

  3. 把mysql文件夹移动到 /usr/local/ 下
    mv mysql-5.6.32-linux-glibc2.5-x86_64 /usr/local/mysql

  4. 创建mysql用户和组

    groupadd mysql
    adduser -r -g mysql mysql
    chown -R mysql.mysql /usr/local/mysql  //修改mysql目录所属mysql用户
    
  5. 安装

    /usr/local/mysql/scripts/mysql_install_db

  6. 修改配置文件my.cnf,必须要修改才能使用mycat

    最后一行添加

    lower_case_table_names = 1

  7. 设置mysql服务

    cp -f /usr/local/mysql/support-files/mysql.server  /etc/init.d/mysqld
    
  8. 启动mysql

    service mysqld start

  9. 把mysql命令加入环境变量

    修改/etc/profile文件,最后行添加
    export PATH=$PATH:/usr/local/mysql/bin

    然后执行

    source /etc/profile

    使配置立即生效

  10. 登陆mysql如果提示错误
    Can't connect to local MySQL server through socket '/tmp/mysql.sock'
    执行命令
    ln /var/lib/mysql/mysql.sock /tmp/mysql.sock
    后再登陆

  11. root用户初始密码为空,修改密码使用mysqladmin命令
    mysqladmin -uroot -p password

  12. 登陆客户端

    mysql -uroot -p

  13. 创建测试数据库

 CREATE database db1;
 CREATE database db2;
 CREATE database db3;

至此mysql已经安装完成了

安装java

mycat安装

  1. 下载mycat

  2. 解压

    tar -zxvf Mycat-server-1.6-RELEASE-20161012170031-linux.tar.gz

  3. 把mycat文件夹移动到 /usr/local/ 下
    mv Mycat-server-1.6-RELEASE-20161012170031-linux /usr/local/mycat

  4. 新建用户和组

    groupadd mycat
    adduser -r -g mycat mycat
    chown -R mycat.mycat /usr/local/mycat  //修改mycat目录所属mycat用户
    
  5. 修改配置文件 /usr/local/mycat/conf/schema.xml

    这里配置mysql的地址、用户名和密码

    <writeHost host="hostM1" url="localhost:3306" user="root" password="root">
        <readHost host="hostS1" url="localhost:3306" user="root" password="root" />
    </writeHost>
    

    server.xml

    这里配置mycat的用户名密码

    <user name="root">
       <property name="password">digdeep</property>
       <property name="schemas">TESTDB</property>
    </user>
    
  6. 启动mycat

    /usr/local/mycat/bin/mycat start

  7. 连接mycat

    mysql -uroot -pdigdeep -h127.0.0.1 -P8066 -DTESTDB

    注意这里 -h 后面必须是ip,使用localhost会出错

  8. 创建测试数据

use TESTDB;
create table company(id int not null primary key,name varchar(50),addr varchar(255));
insert into company values(1,"facebook","usa");
  1. 结果:查看mysql上的数据库db1,db2,db3上都创建了表company

mysql主从服务器配置

  1. 修改主mysql配置文件my.cnf

    [mysqld]
    log_bin = mysql-bin  #记录操作日志
    binlog_ignore_db =  mysql  #不同步mysql系统数据库
    server_id = 1
    
  2. 启动主mysql,在主mysql创建一个用户user让从mysql连接,执行sql

    grant replication slave on *.* to 'user'@'%' identified by 'password'
    
  3. 修改从mysql配置文件my.cnf

    log_bin = mysql-bin  #记录操作日志
    replicate_ignore_db = mysql #不同步mysql系统数据库
    slave_skip_errors = all 
    server_id = 2
    
  4. 主mysql执行sql

    show master status;\G

    1.jpg

  5. 从mysql连接主mysql

    根据第2步配创建的user,password 和 第4步获取的file,position 连接主mysql

//如果是mysql5.5
change master to master_host='node1',master_user='user',master_password='password',master_log_file='mysql-bin.000004',master_log_pos=120;
//如果是mysql5.6即以上可以不需要master_log_file和master_log_pos,mysql会自动识别
change master to master_host='node1',master_user='user',master_password='password';
  1. 开启从mysql,从mysql中执行

    start slave;

  2. 查看从mysql状态,从mysql执行

    show slave status\G;

    2.png

    红色下划线部分为yes则开启成功

  3. 测试成果

    首先在主从mysql上都新建数据库testdb

    主mysql:use testdb;create table user(id int not null primary key,name varchar(50));

    从mysql上也会产生user表,主从mysql配置成功!

读写分离配置

  1. 注意事项

    远程 mysql 必须允许 mycat主机 远程连接,修改mysql.user表中的用户数据,执行sql

    update mysql.user set host = '%' where user = 'root'
    
  2. schema.xml配置

    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
    writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">
        <heartbeat>show slave status</heartbeat>
        <writeHost host="hostM1" url="node1:3306" user="root" password="root">
            <readHost host="hostS1" url="node2:3306" user="root" password="root" />
        </writeHost>
    </dataHost>
    

    dbDriver

    属性

    指定连接后端数据库使用的 Driver,目前可选的值有 native 和 JDBC。使用 native 的话,因为这个值执行的是二进制的 mysql 协议,所以可以使用 mysql 和 maridb。其他类型的数据库则需要使用 JDBC 驱动来支持。

    从 1.6 版本开始支持 postgresql 的 native 原始协议。

    如果使用 JDBC 的话需要将符合 JDBC 4 标准的驱动 JAR 包放到 MYCAT\lib 目录下,并检查驱动 JAR 包中包括如下目录结构的文件:META-INF\services\java.sql.Driver。在这个文件内写上具体的 Driver 类名,例如:com.mysql.jdbc.Driver。

    balance

    属性

    负载均衡类型,目前的取值有 3 种:

    1. balance=”0”, 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。

    2. balance=”1”,全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。

    3. balance=”2”,所有读操作都随机的在 writeHost、readhost 上分发。

    4. balance=”3”,所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压

      力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。

    writeType

    属性

    负载均衡类型,目前的取值有 3 种:

    1. writeType=”0”, 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个

      writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .

    2. writeType=”1”,所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。

    switchType

    属性

    • -1 表示不自动切换

    • 1 默认值,自动切换

    • 2 基于 MySQL 主从同步的状态决定是否切换

      心跳语句为 show slave status

  3. 根据主从延时切换技术

    Mycat1.4开始支持 MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠,配置如下: MyCAT心跳检查语句配置为 show slave status ,dataHost 上定义两个新属性: switchType=”2” 与slaveThreshold=”100”,此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制,Mycat心跳机制通过检测 show slave status 中的 “Seconds_Behind_Master”, “Slave_IO_Running”, “Slave_SQL_Running” 三个字段来确定当前主从同步的状态以及Seconds_Behind_Master 主从复制时延, 当Seconds_Behind_Master>slaveThreshold 时,读写分离筛选器会过滤掉此Slave机器,防止读到很久之前的旧数据,而当主节点宕机后,切换逻辑会检查Slave上的Seconds_Behind_Master是否为0,为0时则表示主从同步,可以安全切换,否则不会切换。

  4. 重启mycat,连接创建测试数据

    use TESTDB;
    create table company(id int not null primary key,name varchar(50),addr varchar(255));
    insert into company values(1,"facebook","usa");
    
  5. 结果:查看主从mysql上的db1,db2,db3上都创建了表company

  6. 如果你的mysql的复制模式为STATEMENT(可以在my.cnf中配置binlog_format="STATEMENT"),还可以这样测试。

    mycat执行sql :

    insert into company values(1,@@hostname,"usa");`
    select * from company ;
    
3.jpg
 可以看出,读取数据是从从mysql读出的
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容