Docker

首页 -  Docker  -  docker安装mycat mysql主从搭建

docker安装mycat mysql主从搭建

docker安装mycat

注意我这里使用的镜像是1.6.5以上的版本因为1.6.5以下版本不支持单库分表

docker search mycat

我用的是manondidi/mycat这个版本的镜像1.6.7.5的

1.拉取镜像

docker pull manondidi/mycat

2.创建配置文件

cd /docker
mkidr mycat
cd mucat
mkidr conf

3.构建容器

docker run -p 8066:8066 -d --name mycat manondidi/mycat

4.复制配置文件(将容器内部的配置文件复制到宿主机)

docker cp mycat:/usr/local/mycat/conf/rule.xml /docker/mycat/conf
docker cp mycat:/usr/local/mycat/conf/server.xml /docker/mycat/conf
docker cp mycat:/usr/local/mycat/conf/schema.xml /docker/mycat/conf

5.为了文件映射方便管理我们可吧容器卸载了重新构建

docker rm -f mycat #强制删除容器
docker run -p 8066:8066 -d --name mycat -v /docker/mycat/conf/rule.xml:/usr/local/mycat/conf/rule.xml -v /docker/mycat/conf/server.xml:/usr/local/mycat/conf/server.xml -v /docker/mycat/conf/schema.xml:/usr/local/mycat/conf/schema.xml manondidi/mycat

6.mycat的目录介绍

bin :mycat程序目录
conf :mycat的配置目录
log:mycat的日志目录
lib:mycat相关的jar包

7.配置文件介绍

rule.xml 这个是配置规则的配置文件
server.xml 这个是mycat的连接配置文件可以设置用户名和密码
schema.xml 这是是配置数据库的

8.编辑配置文件修改完成重启mycat

1.schema.xml 
<table>便签介绍:Name:表名称 primaryKey:主键 subTables:分片表的表名设置 dataNode:数据节点 Rule:分片规则
<dataNode>便签介绍:Name:节点名称 dataHost:数据源名称 Database:真实的数据库名称
<dataHost>便签介绍:Name:数据源名称 maxCon:最大连接数 minCon:最小连接数 Balance:负载均衡类型,有0,1,2,3四种类型 writeType:读写类型:有0,1两种 dbType:数据库类型


<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" >
                <table name="lmrs_orders" primaryKey="id" subTables="lmrs_orders_$0-63" dataNode="orders" rule="mod-long" />
                <table name="lmrs_order_items" primaryKey="id" subTables="lmrs_order_items_$0-63" dataNode="orders" rule="mod-long" />
                <table name="lmrs_user_order_index" primaryKey="user_id" subTables="lmrs_user_order_index_$0-63" dataNode="orders" rule="mod-long-user_id" />
        </schema>
        <dataNode name="orders" dataHost="lmrs_orders" database="lmrs_2008_orders" />
        <dataHost name="lmrs_orders" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="hostM1" url="192.168.0.202:3306" user="xiaoshu" password="root">
                        <readHost host="hostS2" url="192.168.0.202:3306" user="xiaoshu" password="root" />
                </writeHost>
        </dataHost>
</mycat:schema>

2.rule.xml 这个是规则文件 这里的64指的是设置64个分片

<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
 <!-- how many data nodes --> 
 <property name="count">64</property> 
</function>

#这个是加入mod-long-user_id规则
<tableRule name="mod-long-user_id"> 
    <rule> 
    <columns>user_id</columns> 
    <algorithm>mod-long</algorithm> 
    </rule> 
</tableRule>

9.连接mycat

用户名称密码是schema.xml里配置的端口是8066连接ok就能看到这几个表了

image.png

写个查询语句就能看到mycat根据取模自动定位到了对应的表了


下面我们也介绍一下MySQL的主从搭建

1.拉取docker镜像

docker pull mysql

2.创建容器(主)

docker run -p 3306:3306 -d --name mysql -v /docker/mysql/my.cnf:/etc/mysql/my.cnf --privileged=true -e MYSQL_ROOT_PASSWORD=root mysql

这里展示一下配置文件可参考

[client]
port        = 3306
socket        = /tmp/mysql.sock

[mysqld]
secure_file_priv=/var/lib/mysql
port        = 3306
socket        = /tmp/mysql.sock
datadir = /usr/local/mysql/data
default_storage_engine = InnoDB
performance_schema_max_table_instances = 400
table_definition_cache = 400
skip-external-locking
key_buffer_size = 32M
max_allowed_packet = 100G
table_open_cache = 128
sort_buffer_size = 768K
net_buffer_length = 4K
read_buffer_size = 768K
read_rnd_buffer_size = 256K
myisam_sort_buffer_size = 8M
thread_cache_size = 16
tmp_table_size = 32M
default_authentication_plugin = mysql_native_password
lower_case_table_names = 1
sql-mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

explicit_defaults_for_timestamp = true
max_connections = 500
max_connect_errors = 100
open_files_limit = 65535

log-bin=mysql-bin
binlog_format=mixed
server-id = 4
binlog_expire_logs_seconds = 600000
slow_query_log=1
slow-query-log-file=/usr/local/mysql/data/mysql-slow.log
long_query_time=3
early-plugin-load = ""

innodb_data_home_dir = /usr/local/mysql/data
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /usr/local/mysql/data
innodb_buffer_pool_size = 128M
innodb_log_file_size = 64M
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
innodb_max_dirty_pages_pct = 90
innodb_read_io_threads = 1
innodb_write_io_threads = 1

[mysqldump]
quick
max_allowed_packet = 500M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 32M
sort_buffer_size = 768K
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

3.主库开启binlog日志

show master status
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000006 |      374 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
如果有这个就说明开启了
下面是在my.conf配置文件里的配置

log-bin=mysql-bin
binlog_format=mixed
server-id = 1

4.创建一个账户密码 然后给这个账号添加密码用来让重节点连接主节点的账户

create user `xaioshu611`@`%` identified by "root";

grant all on *.* to `xaioshu611`@`%` with grant options;

5.设置好了启动一下docker容器

6.创建重我们就换个端口在这个虚拟机上直接建了

docker run -p 3307:3306 -d --name mysql3307 -v /docker/mysql/my3307.cnf:/etc/mysql/my.cnf --privileged=true -e MYSQL_ROOT_PASSWORD=root mysql

7.修改配置文件这里主要是sercer-id不能和主的重复

server-id = 2

8. 从库开启中继日志,通过show variables like "%relay%";查看

mysql>show variables like "%relay%";
+---------------------------+--------------------------------------------+
| Variable_name             | Value                                      |
+---------------------------+--------------------------------------------+
| max_relay_log_size        | 0                                          |
| relay_log                 | localhost-relay-bin                        |
| relay_log_basename        | /www/server/data/localhost-relay-bin       |
| relay_log_index           | /www/server/data/localhost-relay-bin.index |
| relay_log_info_file       | relay-log.info                             |
| relay_log_info_repository | TABLE                                      |
| relay_log_purge           | ON                                         |
| relay_log_recovery        | OFF                                        |
| relay_log_space_limit     | 0                                          |
| sync_relay_log            | 10000                                      |
| sync_relay_log_info       | 10000                                      |
+---------------------------+--------------------------------------------+
11 rows in set (0.01 sec)

参数详情:
max_relay_log_size
relay log 允许的最大值,如果该值为0,则默认值为 max_binlog_size (1G);
如果不为0,则 max_relay_log_size 则为最大的relay_log文件大小;
relay_log
定义 relay_log 的位置和名称,如果值为空,则默认位置在数据文件的目录;
relay_log_index
定义 relay_log 索引的位置和名称,记录有几个 relay_log 文件,默认为2个
relay_log_info_file
定义 relay-log.info 的位置和名称
relay-log.info 记录 master 主库的 binary_log 的恢复位置和 从库 relay_log 的位置;
relay_log_purge
是否自动清空中继日志,默认值为1(启用);
relay_log_recovery
当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,并且重新从master上获取日志,这样就保证了relay-log的完整性。默认情况下该功能是关闭的,将relay_log_recovery的值设置为 1时,可在slave从库上开启该功能,建议开启;
sync_relay_log
当设置为1时,slave的I/O线程每次接收到master发送过来的binlog日志都要写入系统缓冲区,然后刷入relay log中继日志里,这样是最安全的,因为在崩溃的时候,你最多会丢失一个事务,但会造成磁盘的大量I/O;
当设置为0时,并不是马上就刷入中继日志里,而是由操作系统决定何时来写入,虽然安全性降低了,但减少了大量的磁盘I/O操作。这个值默认是0,可动态修改;
sync_relay_log_info
这个参数和 sync_relay_log 参数一样。


9.开启主从命令在重节点上执行

change master to master_host='192.168.29.102',master_port=3306,master_user='xaioshu611',master_password='root',master_log_file='mysqlbin.000006',master_log_pos=374;
查看master_log_file(binlog日志的名称) 和 master_log_pos(binlog日志节点)在主节点上查看 
用命令:show master status
启动主从命令:start slave;
停止主从命令:stop slave;

命令:show slave status\G 查看这两个配置都为Yes的话就OK了

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

主从的原理是:重分服务发送一个连接主的binarylog日志线程,然后主在像重发送一个日志io线程,重得到主的日志信息后传递给重的中继日志,然后解析执行sql线程(这里会记录每次都执行到了那里)

(0)
分享:

本文由:xiaoshu168.com 作者:xiaoshu发表,转载请注明来源!

标签:

相关阅读