centos7 安装redis
安装redis
yum install -y redis
启动redis
systemctl start redis
配置内网密码登录,打开配置文件vim /etc/redis.conf
# 修改成内网ip bind 172.24.214.105 # 添加下面的配置,配置密码 requirepass 密码
简单记录一些技术解决方案
安装redis
yum install -y redis
启动redis
systemctl start redis
配置内网密码登录,打开配置文件vim /etc/redis.conf
# 修改成内网ip bind 172.24.214.105 # 添加下面的配置,配置密码 requirepass 密码
安装mysql
wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm yum -y install mysql57-community-release-el7-10.noarch.rpm yum -y install mysql-community-server
启动mysql
systemctl start mysqld.service
查看默认密码
grep "password" /var/log/mysqld.log
接着第一次使用的时候要修改默认密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
添加一个可以远程访问的账号
grant all privileges on *.* to '用户名'@'%' identified by '密码'; flush privileges;
1.一致性hash
<function name="murmur" class="io.mycat.route.function.PartitionByMurmurHash"> <property name="seed">0</property><!-- 默认是0 --> <property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 --> <property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 --> <!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key, 以节点权重值为值。所有权重值必须是正整数,否则以1代替 --> <!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> 用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何 东西 --> </function>
2.32位循环冗余校验多项式算法
<function name="crc32slot" class="io.mycat.route.function.PartitionByCRC32PreSlot"> <property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 --> </function>
3.枚举法
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap"> <property name="mapFile">partition-hash-int.txt</property> </function>
4.范围约定
<function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong"> <property name="mapFile">autopartition-long.txt</property> </function>
5.求模法
<function name="mod-long" class="io.mycat.route.function.PartitionByMod"> <!-- how many data nodes --> <property name="count">3</property> </function>
6.固定分片hash算法
<function name="func1" class="io.mycat.route.function.PartitionByLong"> <property name="partitionCount">8</property> <property name="partitionLength">128</property> </function>
7.按单月小时拆分
<function name="latestMonth" class="io.mycat.route.function.LatestMonthPartion"> <property name="splitOneDay">24</property> </function>
8.自然月分片
<function name="partbymonth" class="io.mycat.route.function.PartitionByMonth"> <property name="dateFormat">yyyy-MM-dd</property> <property name="sBeginDate">2015-01-01</property> </function>
9.范围取模分片
<function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod"> <property name="mapFile">partition-range-mod.txt</property> </function>
10.Google的一致性哈希算法
<function name="jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash"> <property name="totalBuckets">3</property> </function>
首先要使用单库多表功能,mycat要1.6.5及以后版本
然后conf/schema.xml的table标签subTables指定表名字,例如我们要分表为order1,order2,order3则可以填写subTables=”order$1-3″
然后conf/rule.xml里面配置的function以前需要指定数据库数量的,现在改成表数量即可。
下面给出配置文件的demo:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="schema1" checkSQLschema="true" sqlMaxLimit="100" > <table name="user" primaryKey="id" autoIncrement="true" dataNode="d1,d2,d3,d4,d5" rule="rule1"/> <table name="order" primaryKey="id" autoIncrement="true" subTables="order$1-3" dataNode="d1" rule="rule2"/> </schema> <dataNode name="d1" dataHost="localhost1" database="db1"/> <dataNode name="d2" dataHost="localhost1" database="db2"/> <dataNode name="d3" dataHost="localhost1" database="db3"/> <dataNode name="d4" dataHost="localhost1" database="db4"/> <dataNode name="d5" dataHost="localhost1" database="db5"/> <dataHost name="localhost1" writeType="0" switchType="1" slaveThreshold="100" balance="1" dbType="mysql" maxCon="10" minCon="1" dbDriver="native"> <heartbeat>show status like 'wsrep%'</heartbeat> <writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root" > </writeHost> </dataHost> </mycat:schema >
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:rule SYSTEM "rule.dtd"> <mycat:rule xmlns:mycat="http://io.mycat/"> <tableRule name="rule1"> <rule> <columns>id</columns> <algorithm>func1</algorithm> </rule> </tableRule> <tableRule name="rule2"> <rule> <columns>id</columns> <algorithm>func2</algorithm> </rule> </tableRule> <function name="func1" class="io.mycat.route.function.PartitionByMod"> <!-- how many data nodes --> <property name="count">5</property> </function> <function name="func2" class="io.mycat.route.function.PartitionByMod"> <!-- how many data nodes --> <property name="count">3</property> </function> </mycat:rule >
mycat是什么?mycat本质是关系型数据库中间件。
mycat解决了什么问题,让我们实现无感知的分表,就是分表之后还是像以前单表那样子使用。
安装:
因为mycat是java写的,所以要先安装java。(安装java可以参考:https://blog.yubang.app/?p=31)
然后在官网下载对应版本,官网是http://www.mycat.io/
然后解压,即可运行
运行命令如下:
./mycat start 启动 ./mycat stop 停止 ./mycat console 前台运行 ./mycat install 添加到系统自动启动(暂未实现) ./mycat remove 取消随系统自动启动(暂未实现) ./mycat restart 重启服务 ./mycat pause 暂停 ./mycat status 查看启动状态
最关键一步,就是配置。我们只需要关心conf/server.xml,conf/schema.xml,conf/rule.xml这三个文件
1.conf/server.xml这个文件是用来配置mycat的系统参数和登录用的用户名密码
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:server SYSTEM "server.dtd"> <mycat:server xmlns:mycat="http://io.mycat/"> <system> <property name="useSqlStat">0</property> <property name="useGlobleTableCheck">0</property> <property name="sequnceHandlerType">2</property> <property name="processorBufferPoolType">0</property> <property name="handleDistributedTransactions">0</property> <property name="useOffHeapForMerge">1</property> <property name="memoryPageSize">1m</property> <property name="spillsFileBufferSize">1k</property> <property name="useStreamOutput">0</property> <property name="systemReserveMemorySize">384m</property> <property name="useZKSwitch">true</property> </system> <user name="root"> <property name="password">123456</property> <property name="schemas">schema1</property> </user> <user name="user"> <property name="password">user</property> <property name="schemas">schema1</property> <property name="readOnly">true</property> </user> </mycat:server>
可以看到<system>标签里面是mycat的基本配置,然后<user>标签是配置登录的用户名和密码,其中name是用户名,password是密码schemas是分片策略。
2.conf/schema.xml文件是指定分片策略的
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="schema1" checkSQLschema="true" sqlMaxLimit="100" > <table name="user" primaryKey="id" autoIncrement="true" dataNode="d1,d2,d3,d4,d5" rule="rule1"/> </schema> <dataNode name="d1" dataHost="localhost1" database="db1"/> <dataNode name="d2" dataHost="localhost1" database="db2"/> <dataNode name="d3" dataHost="localhost1" database="db3"/> <dataNode name="d4" dataHost="localhost1" database="db4"/> <dataNode name="d5" dataHost="localhost1" database="db5"/> <dataHost name="localhost1" writeType="0" switchType="1" slaveThreshold="100" balance="1" dbType="mysql" maxCon="10" minCon="1" dbDriver="native"> <heartbeat>show status like 'wsrep%'</heartbeat> <writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root" > </writeHost> </dataHost> </mycat:schema >
dataHost标签是配置我们真实的数据库信息,name是一个自定义名字,heartbeat是用于保持心跳的,writeHost 是表示写库,host=”hostM1″不需要修改,url是数据库地址,user是数据库用户名,password是数据库密码
dataNode标签是指定一个数据库里面的database,name是自定义名称,dataHost是dataHost标签的name名字,database是我们的数据库名字
schema标签是分片配置,也是conf/schema.xml文件需要的schemas。name是自定义名字,也是conf/schema.xml文件指向的名字。table 标签是配置具体的表,dataNode分散到那些database,rule是指定分布规则。
3.conf/rule.xml这个文件是配置表如何分散到若干个数据库规则的
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:rule SYSTEM "rule.dtd"> <mycat:rule xmlns:mycat="http://io.mycat/"> <tableRule name="rule1"> <rule> <columns>id</columns> <algorithm>func1</algorithm> </rule> </tableRule> <function name="func1" class="io.mycat.route.function.PartitionByMod"> <!-- how many data nodes --> <property name="count">5</property> </function> </mycat:rule >
tableRule标签是定义规则的,name是规则名字,columns是用于指定分片规则的表字段,algorithm是指定分片函数的
function标签是定义分片函数的,name是自定义名字,class对应内置的分片策略,property 是指定一些参数,各种分片策略是不同的
分表之后最总要一个事情就是自增id了,最简单的方法,conf/server.xml里面的<property name=”sequnceHandlerType”>2</property>定义成2,然后conf/schema.xml的table指定autoIncrement,然后字段记得定义成bigint,然后插入就会采用本地时间戳方式生成id
我们要测试mycat,可以用命令行测试
mysql -u root -P8066 -h 127.0.0.1 -p
然后数据库选择用户名对应的schemas,里面的表就是schemas配置的table,剩下的操作跟平时是一致的。