设为首页 收藏本站
查看: 403|回复: 0

[经验分享] MySQL分片高可用集群之Fabric部署使用

[复制链接]

尚未签到

发表于 2018-10-1 09:15:13 | 显示全部楼层 |阅读模式
  Fabric是Oracle公司开发的既有分片又有读写分离的MySQL集群管理工具,虽然个人觉得目前版本还有很多缺陷,但应该会逐步完善,将来会是一个不错的工具。
  第一步:下载并安装 Fabric
  Fabric可以从MySQL官网下载,她属于MySQL Utilites里,官方下载地址是http://dev.mysql.com/downloads/utilities/
  我下载的是源码版的,mysql-utilities-1.5.6.zip,因为是Python所写,所以安装跟C语言的不同:
$ unzip mysql-utilities-1.5.6.zip  
$ cd mysql-utilities-1.5.6/
  
$ python setup.py build
  
$ sudo python setup.py install
  安装好后,原先的python脚本去掉了py后缀,默认放在/usr/local/bin/目录下,可直接执行。
  第一步:部署 MySQL5.6 多实例
  运行Fabric前,我们要先准备若干各数据库,根据我们的需要配置不同数量的数据库,我们先部署基本的读写分离的主从方式,Fabric的需要的利用MySQL的GTID特性进行主从复制,因此需要MySQL5.6以上版本,另外由于MariaDB的GTID特性跟MySQL不同,Fabric不支持MariaDB,使用MariaDB的话有报错。所以只能用MySQL5.6以上版本。
  我们至少需要部署3个MySQL实例才能看到Fabric的功效,
作用地址端口数据文件路径配置文件路径Fabric元数据库localhost10000/dev/shm/data/fa00fabric/fa00.cnf业务数据库 1localhost10011/dev/shm/data/fa11fabric/fa11.cnflocalhost10012/dev/shm/data/fa12fabric/fa12.cnf  TIP:由于我在一台电脑上启动了很多数据库,因此将数据文件都放在了内存硬盘中,我的机器默认有的是/dev/shm,其他的机器根据会有所不同,如/run/shm等,这个路径选择无关紧要,只要事先创建父目录。因为使用内存硬盘,MySQL自身的内存需求降低,我降低了MySQL需要的内存使用量,这个也根据自己的情况选择。注:生产环境不可这样配置。
  主从数据库部署可以参考文章:http://bangbangba.blog.51cto.com/3180873/1701857
  和 http://bangbangba.blog.51cto.com/3180873/1702294
  下面我们还是先修改配置文件,需要修改的内容如下:(以fa00.cnf举例)
# 请自行调整前面6行的数字,每个数据库都不能相同,这里是改了最后两个00对应的数字。  
[client]
  
port            = 10000
  
socket          = /tmp/fa00.sock
  

  
[mysqld]
  
port            = 10000
  
socket          = /tmp/fa00.sock
  
datadir         = /dev/shm/data/fa00
  
server-id       = 10000
  
user            = lyw
  

  
# 主从复制相关
  
log-bin=mysql-bin
  
gtid-mode               = on
  
log-slave-updates       = true
  
enforce-gtid-consistency= true
  

  
# 文件、内存大小,节约内存。
  
innodb_buffer_pool_size = 32M
  
innodb_log_file_size    = 5M
  修改好3个文件配置文件 fa00.cnf,fa11.cnf,fa12.cnf 后,我们初始化数据,并且启动,这次我们采用批量操作的方式,减少工作量。在mysql目录下创建如下脚本init_start.sh和初始化数据库文件fabric.sql,并执行init_start.sh,即可创建所有数据库,并启动。
  fabric.sql 内容为:
use mysql;  
delete from user where user='';
  
flush privileges;
  
grant all on *.* to 'fabric'@'%' identified by '123456';
  
create database lyw;
  
reset master;
  init_start.sh 内容为:
#! /bin/bash  
mkdir -p /dev/shm/data
  
for cnf in `ls fabric/*.cnf`
  
do
  
        scripts/mysql_install_db --defaults-file=$cnf
  
        bin/mysqld --defaults-file=$cnf &
  
done
  

  
# 等待一下,让mysqld启动完成,
  
sleep 3
  

  
for cnf in `ls fabric/*.cnf`
  
do
  
        bin/mysql --defaults-file=$cnf -uroot < fabric.sql
  
done
  准备好脚本后,执行init_start.sh即完成所有数据库的初始化和启动工作,可以启动mysql客户端检查下数据库是否都初始化好。Fabric不需要主动执行change master to这行sql语句来开启主从,而是交由Fabric自身去执行。到此数据库以准备好,接下来开始真正的Fabric配置。
  第三步:Fabric 读写分离主从配置
  fabric的默认配置文件路径为/usr/local/etc/mysql/fabric.cfg,其他安装方法会是/etc/mysql/fabric.cfg(其他系统根据自己情况配置)因此为了方便后面的操作,我们还是使用这个配置文件,当然也可以用--config 参数指定配置文件。
  fabric.cfg内容如下:
[DEFAULT]  
prefix = /usr/local
  
sysconfdir = /usr/local/etc
  
logdir = /var/log
  

  
# storage 配置的是fabric元数据存储的数据库
  
[storage]
  
address = localhost:10000
  
user = fabric
  
password = 123456
  
database = fabric
  
auth_plugin = mysql_native_password
  
connection_timeout = 6
  
connection_attempts = 6
  
connection_delay = 1
  

  
[servers]
  
user = fabric
  
password = 123456
  
backup_user = fabric_backup
  
backup_password = secret
  
restore_user = fabric_restore
  
restore_password = secret
  
unreachable_timeout = 5
  

  
# fabric对外的协议,这里是xmlrpc协议
  
[protocol.xmlrpc]
  
address = localhost:32274
  
threads = 5
  
user = admin
  
password = 123456
  
disable_authentication = yes
  
realm = MySQL Fabric
  
ssl_ca =
  
ssl_cert =
  
ssl_key =
  

  
# fabric对外的协议,这里是mysql协议,能用mysql连接,但是不能跟普通数据库一样操作
  
[protocol.mysql]
  
address = localhost:32275
  
user = admin
  
password = 123456
  
disable_authentication = yes
  
ssl_ca =
  
ssl_cert =
  
ssl_key =
  

  
[executor]
  
executors = 5
  

  
[logging]
  
level = INFO
  
url = file:///var/log/fabric.log
  

  
[sharding]
  
mysqldump_program = /usr/bin/mysqldump
  
mysqlclient_program = /usr/bin/mysql
  

  
[statistics]
  
prune_time = 3600
  

  
[failure_tracking]
  
notifications = 300
  
notification_clients = 50
  
notification_interval = 60
  
failover_interval = 0
  
detections = 3
  
detection_interval = 6
  
detection_timeout = 1
  
prune_time = 3600
  

  
[connector]
  
ttl = 1
  配置好后,需要初始化fabric的元数据
$ mysqlfabric manage setup  
。。。。。。
  
Finishing initial setup
  
=======================
  
Password for admin user is not yet set.
  
Password for admin/xmlrpc:                 这里需要设置admin的密码
  
Repeat Password:                           重复输入密码
  
Password set.
  
Password set.
  这时fa00这个数据库已经有了fabric的元数据,我们可以用mysql客户端查看。
  然后启动
$ mysqlfabric manage start  自此虽然启动了fabric,但是还没有和前面配置的后两个业务数据库产生联系,接下来我们需要用命令行建立联系。我先看一下mysqlfabric的分组相关帮助,
$ mysqlfabric help group  

  
Commands available in group 'group' are:
  
    group activate group_id  [--synchronous]
  
    group description group_id  [--description=NONE] [--synchronous]
  
    group deactivate group_id  [--synchronous]
  
    group create group_id  [--description=NONE] [--synchronous]
  
    group remove group_id server_id  [--synchronous]
  
    group add group_id address  [--timeout=NONE] [--update_only] [--synchronous]
  
    group health group_id
  
    group lookup_servers group_id  [--server_id=NONE] [--status=NONE] [--mode=NONE]
  
    group destroy group_id  [--synchronous]
  
    group demote group_id  [--update_only] [--synchronous]
  
    group promote group_id  [--slave_id=NONE] [--update_only] [--synchronous]
  
    group lookup_groups  [--group_id=NONE]
  我们首先需要创建一个组group-1:
$ mysqlfabric group create group-1  然后将两个业务数据库10011和10012放入这个组中:
$ mysqlfabric group add group-1 127.0.0.1:10011  
$ mysqlfabric group add group-1 127.0.0.1:10012
  然后可以查看这时group-1这个组的状态
$ mysqlfabric group lookup_servers group-1  
Fabric UUID:  5ca1ab1e-a007-feed-f00d-cab3fe13249e
  
Time-To-Live: 1
  

  
                         server_uuid         address    status      mode weight
  
------------------------------------ --------------- --------- --------- ------
  
d4919ca2-754a-11e5-8a5e-34238703623c 127.0.0.1:10011 SECONDARY READ_ONLY    1.0
  
d6597f06-754a-11e5-8a5e-34238703623c 127.0.0.1:10012 SECONDARY READ_ONLY    1.0
  从status 和 mode 这两个字段可以看出,这个时候刚加入的两个服务器还没有正式生效,都是作为从库只读的身份,两个库还没有建立实质的联系,我们需要将其中一个数据库提升为可写的主:
$ mysqlfabric group promote group-1  

  
$ mysqlfabric group lookup_servers group-1
  
Fabric UUID:  5ca1ab1e-a007-feed-f00d-cab3fe13249e
  
Time-To-Live: 1
  

  
                         server_uuid         address    status       mode weight
  
------------------------------------ --------------- --------- ---------- ------
  
d4919ca2-754a-11e5-8a5e-34238703623c 127.0.0.1:10011 SECONDARY  READ_ONLY    1.0
  
d6597f06-754a-11e5-8a5e-34238703623c 127.0.0.1:10012   PRIMARY READ_WRITE    1.0
  用promote命令提升后,其中一台会被提升为主数据库,其他的都为从。主从也可以通过mysql客户端查看,在从库执行下面的命令显示如下,主库执行则没有信息
mysql> show slave status \G;  
*************************** 1. row ***************************
  
               Slave_IO_State: Waiting for master to send event
  
                  Master_Host: 127.0.0.1
  
                  Master_User: fabric
  
                  Master_Port: 10012
  
                Connect_Retry: 60
  
              Master_Log_File: mysql-bin.000001
  
          Read_Master_Log_Pos: 151
  
               Relay_Log_File: lyw-hp-relay-bin.000002
  
                Relay_Log_Pos: 361
  
        Relay_Master_Log_File: mysql-bin.000001
  
             Slave_IO_Running: Yes
  
            Slave_SQL_Running: Yes
  
                          。。。。。。
  至此主从方式以基本可用,我们迫不及待地想要尝试下客户端如何使用了。官方提供python和java两种客户的,因此如果用Fabric,业务语言最好是这两种。
  Fabric是python所写,我们这里就用python客户端做例子,直接打开python交互界面
$ python  
Python 2.7.9 (default, Apr  2 2015, 15:33:21)
  
[GCC 4.9.2] on linux2
  
Type "help", "copyright", "credits" or "license" for more information.
  
>>> import mysql.connector
  
>>> from mysql.connector import fabric
  
>>> conn = mysql.connector.connect(fabric={"host":"localhost", "port":32274, "username":"lyw", "password":"123456"}, user="fabric", password="123456", autocommit=True)
  
>>> conn.set_property(group='group-1', scope=fabric.SCOPE_GLOBAL, mode=fabric.MODE_READWRITE)
  
>>> cur = conn.cursor()
  
>>> cur.execute('create database lyw')
  
>>> cur.execute('use lyw;')
  
>>> cur.execute('create table t1 (id int, v varchar(32))')
  
>>> cur.execute('insert into t1 values(1, "aaa"), (2,"bbb")')
  
>>> cur.execute('select * from t1')
  
>>> cur.fetchall()
  
[(1, u'aaa'), (2, u'bbb')]
  

  
#下面切换到从库下只读数据,这时下面的sql语句是切换到了从库执行,需要重新'use lyw'
  
>>> conn.set_property(group='group-1', scope=fabric.SCOPE_GLOBAL, mode=fabric.MODE_READONLY)
  
>>> cur.execute('use lyw')
  
>>> cur.execute('select * from t1')
  
>>> cur.fetchall()
  
[(1, u'aaa'), (2, u'bbb')]
  这个python例子可以很好的看出主从方式下fabric的基本使用,
  注意:请勿在从库执行写操作,否则数据会不符合预期,不会同步到主。
  此时如果主数据库挂了,那么写操作将不可用,fabric还不会自动切换,要想进行自动切换,需要执行以下命令:
$ mysqlfabric group activate group-1  
主库挂掉几秒钟后
  
$ mysqlfabric group lookup_servers group-1
  
Fabric UUID:  5ca1ab1e-a007-feed-f00d-cab3fe13249e
  
Time-To-Live: 1
  

  
                         server_uuid         address  status       mode weight
  
------------------------------------ --------------- ------- ---------- ------
  
a30d844d-7550-11e5-8a84-34238703623c 127.0.0.1:10011 PRIMARY READ_WRITE    1.0
  
a4d66a55-7550-11e5-8a84-34238703623c 127.0.0.1:10012  FAULTY READ_WRITE    1.0
  然后我们干掉主库,过几秒种查看状态,可以发现从库以切换为主库。原先的主库变为FAULTY
  但是当挂掉的源主库重新启动时,不会自动加入到集群里面,需要先remove,再add回来才行。
$ mysqlfabric group remove group-1 127.0.0.1:10012  
$ mysqlfabric group add group-1 127.0.0.1:10012
  
$ mysqlfabric group lookup_servers group-1
  
Fabric UUID:  5ca1ab1e-a007-feed-f00d-cab3fe13249e
  
Time-To-Live: 1
  

  
                         server_uuid         address    status       mode weight
  
------------------------------------ --------------- --------- ---------- ------
  
a30d844d-7550-11e5-8a84-34238703623c 127.0.0.1:10011   PRIMARY READ_WRITE    1.0
  
a4d66a55-7550-11e5-8a84-34238703623c 127.0.0.1:10012 SECONDARY  READ_ONLY    1.0
  状态变为只读从库,再去查数据,可以发现宕机期间的数据被恢复(需要一定时间)
  第四步:分片+主从 部署
  我们前面准备了很多脚本,部署已很方便,这里我先拆除前面的数据,重新部署,读者可以根据自己喜好操作。
  我们这次要部署如下列表的数据库
作用地址端口文件路径配置路径Fabric元数据localhost10000/dev/shm/data/fa00fabric/fa00.cnf业务数据库 全局localhost10091/dev/shm/data/fa91fabric/fa91.cnflocalhost10092/dev/shm/data/fa92fabric/fa92.cnf业务数据库 1localhost10011/dev/shm/data/fa11fabric/fa11.cnflocalhost10012/dev/shm/data/fa12fabric/fa12.cnf业务数据库 2localhost10021/dev/shm/data/fa21fabric/fa21.cnflocalhost10022/dev/shm/data/fa22fabric/fa22.cnf业务数据库 3localhost10031/dev/shm/data/fa31fabric/fa31.cnflocalhost10032/dev/shm/data/fa32fabric/fa32.cnf  我们复制之前的配置文件,修改其中的主要数据,准备好这9个配置文件fa00.cnf ~ fa32.cnf
  然后我们我们初始化环境
$ sh init_start.sh  
$ mysqlfabric manage setup
  
$ mysqlfabric manage start
  只要3行就初始化完,轻松吧。
  然后我们要创建4个fabric组,group-g,group-1,group-2,group-3
$ mysqlfabric group create group-g  
$ mysqlfabric group create group-1
  
$ mysqlfabric group create group-2
  
$ mysqlfabric group create group-3
  将数据库放入这4个组中,
$ mysqlfabric group add group-g 127.0.0.1:10091  
$ mysqlfabric group add group-g 127.0.0.1:10092
  

  
$ mysqlfabric group add group-1 127.0.0.1:10011
  
$ mysqlfabric group add group-1 127.0.0.1:10012
  

  
$ mysqlfabric group add group-2 127.0.0.1:10021
  
$ mysqlfabric group add group-2 127.0.0.1:10022
  

  
$ mysqlfabric group add group-3 127.0.0.1:10031
  
$ mysqlfabric group add group-3 127.0.0.1:10032
  并且都选出主来
$ mysqlfabric group promote group-g  
$ mysqlfabric group promote group-1
  
$ mysqlfabric group promote group-2
  
$ mysqlfabric group promote group-3
  现在为止只是纯粹的创建了4个独立的组,我们用的命令都是group相关的,接下来就是分片的重头戏了,需要用sharding相关命令,我们还是先来看下sharding的简单帮助
$ mysqlfabric help sharding  

  
Commands available in group 'sharding' are:
  
    sharding list_definitions
  
    sharding remove_definition shard_mapping_id  [--synchronous]
  
    sharding move_shard shard_id group_id  [--update_only] [--synchronous]
  
    sharding disable_shard shard_id  [--synchronous]
  
    sharding remove_table table_name  [--synchronous]
  
    sharding split_shard shard_id group_id  [--split_value=NONE] [--update_only] [--synchronous]
  
    sharding create_definition type_name group_id  [--synchronous]
  
    sharding add_shard shard_mapping_id groupid_lb_list  [--state=DISABLED] [--synchronous]
  
    sharding add_table shard_mapping_id table_name column_name  [--synchronous]
  
    sharding lookup_table table_name
  
    sharding enable_shard shard_id  [--synchronous]
  
    sharding remove_shard shard_id  [--synchronous]
  
    sharding list_tables sharding_type
  
    sharding prune_shard table_name  [--synchronous]
  
    sharding lookup_servers table_name key  [--hint=LOCAL]
  好,首先我们需要创建一个definition:
$ mysqlfabric sharding create_definition RANGE group-g  
Fabric UUID:  5ca1ab1e-a007-feed-f00d-cab3fe13249e
  
Time-To-Live: 1
  

  
                                uuid finished success result
  
------------------------------------ -------- ------- ------
  
c106bd7a-e8f8-405e-97ec-6886cec87346        1       1      1
  记下result字段的数字1,这个就是shard_mapping_id,后续操作都需要他。
  然后增加一个表定义,后面3各参数分别是shard_mapping_id, 表名,分片的字段名
$ mysqlfabric sharding add_table  1  lyw.table1  id  接着增加分片的区间定义,这时才将那3个组用上
$ mysqlfabric sharding add_shard 1 "group-1/0, group-2/10000, group-3/20000" --state=ENABLED  因为我们这里用的是range方式,所以每个组的后面都要加一个分组的起始数字。
  后面的--state=ENABLED 表示马上生效。
  基于range的分片就创建好了,我们还是迫不及待的去测试一下。我们还是用python交互界面执行
$ python  
Python 2.7.9 (default, Apr  2 2015, 15:33:21)
  
[GCC 4.9.2] on linux2
  
Type "help", "copyright", "credits" or "license" for more information.
  
>>> import mysql.connector
  
>>> from mysql.connector import fabric
  
>>> conn = mysql.connector.connect(fabric={"host":"localhost", "port":32274, "username":"lyw", "password":"123456"}, user="fabric", password="123456", autocommit=True)
  
>>> conn.set_property(group='group-g', scope=fabric.SCOPE_GLOBAL, mode=fabric.MODE_READWRITE)
  
>>> cur = conn.cursor()
  
>>> cur.execute('create database lyw')
  
>>> cur.execute('use lyw;')
  
>>> cur.execute('create table table1 (id int, v varchar(32))')
  这时,我们去8个数据库直接查看,会发现所有数据库都创建了数据库lyw和表table1;因为我们使用了scope=fabric.SCOPE_GLOBAL 参数,所以这个操作在10091这个库执行后,会同步到其他所有数据库中去,记得其他数据库的数据是有延迟的。
  然后我们进行分片插入数据,fabric的分片操作有点麻烦,用两个函数辅助一下比较方便,下面代码可以粘贴到交互界面中去。
import random  

  
def ins(conn, table, key):
  
     conn.set_property(tables=[table], key=key, scope=fabric.SCOPE_LOCAL, mode=fabric.MODE_READWRITE)
  
     cur=conn.cursor()
  
     #cur.execute('use lyw;')
  
     cur.execute("insert into %s values('%s', 'aaa')" % (table, key) )
  

  
def rand_ins(conn, table, count):
  
    for i in range(count):
  
        key = random.randint(0, 30000)
  
        ins(conn, table, key)
  然后我们在交互界面执行rand_ins函数随机插入若干条数据
>>> connl = mysql.connector.connect(fabric={"host":"localhost", "port":32274, "username":"lyw", "password":"123456"}, user="fabric", password="123456", autocommit=True)  
>>> rand_ins(connl, 'lyw.table1', 100)
  这样就向数据库随机插入了100条数据,我们可以用mysql客户端直接链接后面的6个库查看,一般情况每个库都有数据库,第一组数据都是小于10000的数据,第二组都是10000-20000的数据,第三组都是20000以上的数据,并且行数总和为100,就是我们插入的总条数。
  注意:使用分片时,如果key换了,就需要重新获得游标和数据库,即ins函数的前3行,使用数据库也可以直接将表名写在sql语句中。否则插入数据会不符合预期。
  除了RANGE分片外,fabric还提供了其他的方式,有HASH,RANGE_DATETIME, RANGE_STRING
  我们下面讲一下HASH分片。
  HASH 分片
$ mysqlfabric sharding create_definition HASH group-g  
Fabric UUID:  5ca1ab1e-a007-feed-f00d-cab3fe13249e
  
Time-To-Live: 1
  

  
                                uuid finished success result
  
------------------------------------ -------- ------- ------
  
9ba5c378-9f99-43bc-8f54-7580cff565f6        1       1      2
  
$ mysqlfabric sharding add_table 2 lyw.table2 id
  
$ mysqlfabric sharding add_shard 2 "group-1, group-2, group-3" --state=ENABLED
  配置已完成,只要3行命令,hash方式的分组后面不用加数字,分组由系统自行计算获得。
  我们还是测试一下
>>> conn = mysql.connector.connect(fabric={"host":"localhost", "port":32274, "username":"lyw", "password":"123456"}, user="fabric", password="123456", autocommit=True)  
>>> conn.set_property(group='group-g', scope=fabric.SCOPE_GLOBAL, mode=fabric.MODE_READWRITE)
  
>>> cur = conn.cursor()
  
>>> cur.execute('use lyw;')
  
>>> cur.execute('create table table2 (id int, v varchar(32))')
  
>>> connl = mysql.connector.connect(fabric={"host":"localhost", "port":32274, "username":"lyw", "password":"123456"}, user="fabric", password="123456", autocommit=True)
  
>>> rand_ins(connl, 'lyw.table2', 100)
  同样可以发现每个库中都有了数据,只是没有太好的规律,并且可能还会发现每个数据库的数据行数相差比较远,这个看运气,可能相差10倍之大,因此我觉得目前fabric的Hash方法不够好,分布太不均匀,HASH方式不建议使用。
  RANGE_DATETIME 分片
$ mysqlfabric sharding create_definition RANGE_DATETIME group-g  
$ mysqlfabric sharding add_table 3 lyw.table3 dt
  
$ mysqlfabric sharding add_shard 3 'group-1/2015-1-1, group-2/2015-2-1,group-3/2015-3-1' --state=ENABLED
  这样3行就可以了,记得写数据的时候key用datetime.date类型,不能用datetime.datetime。
  当需要按照时间分区的时候,就可以这样做,然而我个人认为,最近的时间是热数据的情况下,用fabric分片其实并不是否妥当,用mysql自带的时间分片会更好。
  注意:目前版本fabric在datetime上有bug,如果加上几分几秒,需要修改3处代码,方可运行,由于我只是作了简短测试,可能还有其他bug,所以不在此发布diff。
  RANGE_STRING 分片
$ mysqlfabric sharding create_definition RANGE_STRING group-g  
$ mysqlfabric sharding add_table 4 lyw.table4 name
  
$ mysqlfabric sharding add_shard 4 'group-1/a, group-2/c,group-3/e' --state=ENABLED
  这样name为a和b开头的行都会放在group-1,c和d开头的都会放在group-2,大于等于e的都会放在group-3里面了。这种分片方式还是有挺大用处的,十分推荐。可以用前面的ins函数测试。
  以上是Fabric的基本功能使用,一点点去深究后会发现Fabric也存在这样那样的缺陷,可能不适合您的业务场景,另外我写了篇Cobar集群的部署使用,和MySQL Cluster的部署使用,请大家参考。
  在多种集群之间选择犹豫时,可以参考下《MySQL Cluster, Fabric, Cobar 三大集群特性对比》这篇文章,一定会对你有所帮助的。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-606974-1-1.html 上篇帖子: Mysql 一主多实例与主从同步详解 下篇帖子: mysql之日志和mysqlbinlog工具的使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表