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 mycat mkdir 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 --privileged=true 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就能看到这几个表了
写个查询语句就能看到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线程(这里会记录每次都执行到了那里)
本文由:xiaoshu168.com 作者:xiaoshu发表,转载请注明来源!