ha-jdbc mysql集群_mysql  集群jdbc

此例以最简明的方式说明MySQL主从复制的配置方法,

此处有2个mysql实例,my1,my2

修改各自的my.ini配置文件

在[mysqld]区域中

主从实例共同配置点:

1,增加实例标致

server-id=x x

为整数,每个mysql实例各不相同

2,要实现主从复制需要改为mysql备份方式修改(或增加)

log-bin=mysql-bin 指定使用mysql二进制方式进行复制,此步为必须配置.

以上两个为共同点,不同点为:

3,对于主MySQL实例(my1),需要指定有哪些数据库需要备份

binlog-do-db=mydb

对于从MySQL实例(my2),需要指定去哪个主MySQL中去复制哪些内容

master-host=xxx

master-user=xx

master-password=***

master-port=xxxx

master-connect-retry=60 这个数字可以自己定

replicate-do-db=test 复制哪个数据库

log-slave-updates

以上为MySQL主从复制的基本方式,通过以上的配置,从mysql已经可以正常复制了。

登录从Mysql,

mysql>show slave

status\G;

*************************** 1.

row ***************************

Slave_IO_State: Waiting for master to

send event

Master_Host: localhost

Master_User: root

Master_Port: 3310

Connect_Retry: 60

Master_Log_File: mysql-bin.000004

Read_Master_Log_Pos: 98

Relay_Log_File: win7-PC-relay-bin.000009

Relay_Log_Pos: 235

Relay_Master_Log_File: mysql-bin.000004

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB: test

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno: 0

Last_Error:

Skip_Counter: 0

Exec_Master_Log_Pos: 98

Relay_Log_Space: 235

Until_Condition: None

Until_Log_File:

Until_Log_Pos: 0

Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master: 0

1 row in set (0.00 sec)

可以看出,从MySQL已经开始工作了,现在可以去主MySQL中增加一个表,看看从MySQL中有没有。

大家在网上都能找到都是RedHat系统等等,对Ubuntu系统MySQL集群就没有介绍文章

我现在写写Ubuntu这个MySQL集群方法。新手不要骂我,呵呵。

介绍网络环境:

测试环境:

Server1: ndbd 192.168.245.11

Server2: ndbd 192.168.245.12

Server3: mysqld –ndb-cluster 192.168.245.13

ndbd: 数据库节点。

mysqld –ndb-cluster: MySQL服务器节点,程序直接访问的是这台机器的IP。默认端口仍是3306。

ndbd_mgm ndbd_mgmd:管理节点。管理/查看各库节点和服务器节点的状态。

二、集群方案

1.管理节点:server3(192.168.245.13)

2.存储节点:server1(192.168.245.11),server2(192.168.245.12)

3.SQL节点:server1(192.168.245.11),server2(192.168.245.12),server3(192.168.245.13)

三、mysql安装和配置

1.安装,sudo apt-get install mysql-server

2.配置这三台服务器上配置my.cnf,这三台服务器都要配置

vim /etc/mysql/my.cnf

—————————————–my.cnf开始——————————————–

Ubuntu@ubuntu:~$ cat /etc/mysql/my.cnf

#

# The MySQL database server configuration file.

#

# You can copy this to one of:

# - “/etc/mysql/my.cnf” to set global options,

# - “~/.my.cnf” to set user-specific options.

#

# One can use all long options that the program supports.

# Run program with –help to get a list of available options and with

# –print-defaults to see which it would actually understand and use.

#

# For explanations see

# http://dev.mysql.com/doc/mysql/en/serve ... ables.html

# This will be passed to all mysql clients

# It has been reported that passwords should be enclosed with ticks/quotes

# escpecially if they contain “#” chars…

# Remember to edit /etc/mysql/debian.cnf when changing the socket location.

[client]

port=3306

socket= /var/run/mysqld/mysqld.sock

# Here is entries for some specific programs

# The following values assume you have at least 32M ram

# This was formally known as [safe_mysqld]. Both versions are currently parsed.

[mysqld_safe]

socket= /var/run/mysqld/mysqld.sock

nice=0

[mysqld]

#

# * Basic Settings

#

#

# * IMPORTANT

# If you make changes to these settings and your system uses apparmor, you may

# also need to also adjust /etc/apparmor.d/usr.sbin.mysqld.

#

user=mysql

pid-file= /var/run/mysqld/mysqld.pid

socket= /var/run/mysqld/mysqld.sock

port=3306

basedir= /usr

datadir= /var/lib/mysql

tmpdir= /tmp

language= /usr/share/mysql/english

skip-external-locking

#

# Instead of skip-networking the default is now to listen only on

# localhost which is more compatible and is not less secure.

#bind-address=127.0.0.1

#

# * Fine Tuning

#

key_buffer=16M

max_allowed_packet=16M

thread_stack=128K

thread_cache_size=8

#max_connections=100

#table_cache=64

#thread_concurrency=10

#

# * Query Cache Configuration

#

query_cache_limit=1M

query_cache_size=16M

#

# * Logging and Replication

#

# Both location gets rotated by the cronjob.

# Be aware that this log type is a performance killer.

#log= /var/log/mysql/mysql.log

#

# Error logging goes to syslog. This is a Debian improvement

#

# Here you can see queries with especially long duration

#log_slow_queries= /var/log/mysql/mysql-slow.log

#long_query_time=2

#log-queries-not-using-indexes

#

# The following can be used as easy to replay backup logs or for replication.

# note: if you are setting up a replication slave, see README.Debian about

# other settings you may need to change.

#server-id=1

#log_bin= /var/log/mysql/mysql-bin.log

expire_logs_days=10

max_binlog_size=100M

#binlog_do_db=include_database_name

#binlog_ignore_db=include_database_name

#

# * BerkeleyDB

#

# Using BerkeleyDB is now discouraged as its support will cease in 5.1.12.

skip-bdb

#

# * MyISAM

#

# MyISAM is enabled by default with a 10MB datafile in /var/lib/mysql/.

# Read the manual for more MyISAM related options. There are many!

# You might want to disable MyISAM to shrink the mysqld process by circa 100MB.

#skip-innodb

#

# * Security Features

#

# Read the manual, too, if you want chroot!

#chroot= /var/lib/mysql/

#

# For generating SSL certificates I recommend the OpenSSL GUI “tinyca”.

#

#ssl-ca=/etc/mysql/cacert.pem

#ssl-cert=/etc/mysql/server-cert.pem

#ssl-key=/etc/mysql/server-key.pem

ndbcluster

ndb-connectstring=192.168.245.13

[mysqldump]

quick

quote-names

max_allowed_packet=16M

[mysql]

#no-auto-rehash # faster start of mysql but no tab completition

[isamchk]

key_buffer=16M

#

# * NDB Cluster

#

# See /usr/share/doc/mysql-server-*/README.Debian for more information.

#

# The following configuration is read by the NDB Data Nodes (ndbd processes)

# not from the NDB Management Nodes (ndb_mgmd processes).

#

[MYSQL_CLUSTER]

ndb-connectstring=192.168.245.13

#

# * IMPORTANT: Additional settings that can override those from this file!

# The files must end with ‘.cnf’, otherwise they’ll be ignored.

#

!includedir /etc/mysql/conf.d/

Ubuntu@ubuntu:~$

———————————my.cnf结束———————————————————

主要在:[mysqld]下添加:

ndbcluster

ndb-connectstring=192.168.245.13

和添加

[MYSQL_CLUSTER]

ndb-connectstring=192.168.245.13

上面三台服务器都要一样

2.配置ndb_mgmd.cnf(192.168.245.13服务器上配置)

复制/usr/share/doc/mysql-server-5.0/examples/ndb_mgmd.cnf到/etc/mysql/ndb_mgmd.cnf

编辑ndb_mgmd.cnf

——————-开始————

Ubuntu@ubuntu:~$ cat /etc/mysql/ndb_mgmd.cnf

[NDBD DEFAULT]

NoOfReplicas=2

DataMemory=10MB

IndexMemory=25MB

MaxNoOfTables=256

MaxNoOfOrderedIndexes=256

MaxNoOfUniqueHashIndexes=128

[MYSQLD DEFAULT]

[NDB_MGMD DEFAULT]

[TCP DEFAULT]

[NDB_MGMD]

Id=1# the NDB Management Node (this one)

HostName=192.168.245.13

DataDir= /var/lib/mysql-cluster

[NDBD]

Id=2# the first NDB Data Node

HostName=192.168.245.11

DataDir= /var/lib/mysql-cluster

[NDBD]

Id=3# the second NDB Data Node

HostName=192.168.245.12

DataDir=/var/lib/mysql-cluster

[MYSQLD]

Id=4# the first SQL node

HostName=192.168.245.13

[MYSQLD]

Id=5# the first SQL node

HostName=192.168.245.11

[MYSQLD]

Id=6# the first SQL node

HostName=192.168.245.12

Ubuntu@ubuntu:~$

——————-结束————

先启动:

13服务器:

sudo /etc/init.d/mysql-ndb-mgm start

然后启动

11.12服务器

sudo /etc/init.d/mysql-ndb start

最后启动,13.11.12服务器mysql服务

sudo /etc/init.d/mysql start

测试:

13服务器上:

neo@mgm:~$ ndb_mgm

– NDB Cluster — Management Client –

ndb_mgm>show

Connected to Management Server at: localhost:1186

Cluster Configuration

———————

[ndbd(NDB)] 2 node(s)

id=2@192.168.245.11 (Version: 5.0.51, Nodegroup: 0)

id=3@192.168.245.12 (Version: 5.0.51, Nodegroup: 0, Master)

[ndb_mgmd(MGM)] 1 node(s)

id=1@192.168.245.13 (Version: 5.0.51)

[mysqld(API)] 2 node(s)

id=4@192.168.245.13 (Version: 5.0.51)

id=5@192.168.245.11 (Version: 5.0.51)

id=5@192.168.245.12 (Version: 5.0.51)

ndb_mgm>

与没有使用簇的MySQL相比,在MySQL簇内操作数据的方式没有太大的区别。

执行这类操作时应记住三点

1.表必须用ENGINE=NDB或ENGINE=NDBCLUSTER选项创建,或用ALTER TABLE选项更改,以使用NDB

Cluster存储引擎在

Cluster内复制它们。如果使用mysqldump的输出从已有数据库导入表,可在文本编辑器中打开SQL脚本,并将该选项添加到任何表创建语句,或

用这类选项之一替换任何已有的ENGINE(或TYPE)选项。

2.另外还请记住,每个NDB表必须有一个主键。如果在创建表时用户未定义主键,NDB

Cluster存储引擎将自动生成隐含的主键。(注释:该隐含

键也将占用空间,就像任何其他的表索引一样。由于没有足够的内存来容纳这些自动创建的键,出现问题并不罕见)。

3.当你在一个节点上运行create database mydb;你去其他sql node上执行show

databases;将不能看到mydb,你需要创建它,然后use mydb; show tables;你将看到同步的表。

SQL Node 1

neo@sql:~$ mysql -uroot -p

Enter password:

Welcome to the MySQL monitor. Commands end with ; or g.

Your MySQL connection id is 7

Server version: 5.0.51a-3Ubuntu5.1 (Ubuntu)

Type ‘help;’ or ‘h’ for help. Type ‘c’ to clear the buffer.

mysql>create database cluster;

Query OK, 1 row affected (0.00 sec)

mysql>use cluster

Database changed

mysql>create table city( id mediumint unsigned not null auto_increment primary key,

name varchar(20) not null default ” )engine=ndbclusterdefault

charset utf8;

Query OK, 0 rows affected (1.07 sec)

mysql>insert into city values(1, ‘Shenzhen’);

Query OK, 1 row affected (0.12 sec)

mysql>insert into city values(2, ‘Guangdong’);

Query OK, 1 row affected (0.00 sec)

SQL Node 2

neo@sql:~$ mysql -uroot -p

Enter password:

Welcome to the MySQL monitor. Commands end with ; or g.

Your MySQL connection id is 7

Server version: 5.0.51a-3Ubuntu5.1 (Ubuntu)

Type ‘help;’ or ‘h’ for help. Type ‘c’ to clear the buffer.

mysql>show databases;

——————–

| Database |

——————–

| information_schema |

| example |

| mydb |

| mysql |

| neo |

——————–

6 rows in set (0.13 sec)

mysql>create database cluster;

Query OK, 1 row affected (0.00 sec)

mysql>show databases;

——————–

| Database |

——————–

| information_schema |

| cluster |

| example |

| mydb |

| mysql |

| neo |

——————–

6 rows in set (0.13 sec)

mysql>use cluster;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql>show tables;

——————-

| Tables_in_cluster |

——————-

| city |

——————-

1 row in set (0.01 sec)

mysql>select * from city;

—- ———–

| id | name |

—- ———–

| 1 | Shenzhen |

| 2 | Guangdong |

—- ———–

2 rows in set (0.03 sec)

mysql>

项目中使用mysql 主从复制,但是用程序实现的读写分离,代码片段如下:

1

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png public DataSource getDataSource(MethodType

methodType) a4c26d1e5885305701be709a3d33442f.png{2a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png if (methodType == MethodType.WRITE) a4c26d1e5885305701be709a3d33442f.png{3a4c26d1e5885305701be709a3d33442f.png return getDataSource(MasterDataSources);4a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png } else a4c26d1e5885305701be709a3d33442f.png{5a4c26d1e5885305701be709a3d33442f.png return getDataSource(SlaveDataSources);6a4c26d1e5885305701be709a3d33442f.png }7a4c26d1e5885305701be709a3d33442f.png }

获取数据源,首先你要确定MethodType 类型,一个是读,一个是写

1

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.pngpublic enum MethodType a4c26d1e5885305701be709a3d33442f.png{2a4c26d1e5885305701be709a3d33442f.png READ,

WRITE3a4c26d1e5885305701be709a3d33442f.png}

读是获取从库数据源,写是获取主库数据源。

这样,就需要在jdbc配置配置两个数据源(一主一从)

还有另一种实现方式,不用程序来控制。mysql 驱动包提供相应的实现

com.mysql.jdbc.ReplicationDriver.

我写了一个简单的例子:

1

a4c26d1e5885305701be709a3d33442f.pngpackage com.howard.loadbalance;2a4c26d1e5885305701be709a3d33442f.png3a4c26d1e5885305701be709a3d33442f.pngimport java.sql.Connection;4a4c26d1e5885305701be709a3d33442f.pngimport java.sql.ResultSet;5a4c26d1e5885305701be709a3d33442f.pngimport java.sql.SQLException;6a4c26d1e5885305701be709a3d33442f.pngimport java.sql.Statement;7a4c26d1e5885305701be709a3d33442f.pngimport java.util.Properties;8a4c26d1e5885305701be709a3d33442f.pngimport java.util.concurrent.ExecutorService;9a4c26d1e5885305701be709a3d33442f.pngimport java.util.concurrent.Executors;10a4c26d1e5885305701be709a3d33442f.png11a4c26d1e5885305701be709a3d33442f.pngimport org.slf4j.Logger;12a4c26d1e5885305701be709a3d33442f.pngimport org.slf4j.LoggerFactory;13a4c26d1e5885305701be709a3d33442f.png14a4c26d1e5885305701be709a3d33442f.pngimport com.mysql.jdbc.ReplicationDriver;15a4c26d1e5885305701be709a3d33442f.png16a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.pngpublic class MysqlTest a4c26d1e5885305701be709a3d33442f.png{17a4c26d1e5885305701be709a3d33442f.png18a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png public static class QueryRunnable implements Runnable a4c26d1e5885305701be709a3d33442f.png{19a4c26d1e5885305701be709a3d33442f.png20a4c26d1e5885305701be709a3d33442f.png protected final static Logger

logger = LoggerFactory21a4c26d1e5885305701be709a3d33442f.png

.getLogger(QueryRunnable.class);22a4c26d1e5885305701be709a3d33442f.png23a4c26d1e5885305701be709a3d33442f.png

@Override24a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png public void run() a4c26d1e5885305701be709a3d33442f.png{25a4c26d1e5885305701be709a3d33442f.png

logger.info("user

size: " + this.query());26a4c26d1e5885305701be709a3d33442f.png }27a4c26d1e5885305701be709a3d33442f.png28a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png public int query() a4c26d1e5885305701be709a3d33442f.png{29a4c26d1e5885305701be709a3d33442f.png int count =

0;30a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png try a4c26d1e5885305701be709a3d33442f.png{31a4c26d1e5885305701be709a3d33442f.png ReplicationDriver

driver = new ReplicationDriver();32a4c26d1e5885305701be709a3d33442f.png Properties props

= new Properties();33a4c26d1e5885305701be709a3d33442f.png props.put("roundRobinLoadBalance",

"true");34a4c26d1e5885305701be709a3d33442f.png props.put("autoReconnect",

"true");35a4c26d1e5885305701be709a3d33442f.png props.put("user",

"core");36a4c26d1e5885305701be709a3d33442f.png props.put("password",

"core");37a4c26d1e5885305701be709a3d33442f.png Connection conn

= null;38a4c26d1e5885305701be709a3d33442f.png Statement stat

= null;39a4c26d1e5885305701be709a3d33442f.png ResultSet res

= null;40a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png try a4c26d1e5885305701be709a3d33442f.png{41a4c26d1e5885305701be709a3d33442f.png conn = driver42a4c26d1e5885305701be709a3d33442f.png

.connect(43a4c26d1e5885305701be709a3d33442f.png //注意url串中间不要有空格,因为mysql源码对多个地址split时没有trim.44a4c26d1e5885305701be709a3d33442f.png "jdbc:mysql:replication://127.0.0.1:3309,127.0.0.1:3306/core",

45a4c26d1e5885305701be709a3d33442f.png

props);46a4c26d1e5885305701be709a3d33442f.png //读写分离标记47a4c26d1e5885305701be709a3d33442f.png //当设置true时,只会在从库查询数据48a4c26d1e5885305701be709a3d33442f.png //当设置false时,会在主库做更新删除操作49a4c26d1e5885305701be709a3d33442f.png//

conn.setReadOnly(true);50a4c26d1e5885305701be709a3d33442f.png stat =

conn.createStatement();51a4c26d1e5885305701be709a3d33442f.png res = stat.executeQuery("select

count(1) from c_user");52a4c26d1e5885305701be709a3d33442f.png while (res.next())53a4c26d1e5885305701be709a3d33442f.png count = res.getInt(1);54a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png } finally a4c26d1e5885305701be709a3d33442f.png{55a4c26d1e5885305701be709a3d33442f.png if (res

!= null)56a4c26d1e5885305701be709a3d33442f.png

res.close();57a4c26d1e5885305701be709a3d33442f.png if (stat != null)58a4c26d1e5885305701be709a3d33442f.png

stat.close();59a4c26d1e5885305701be709a3d33442f.png if (conn != null)60a4c26d1e5885305701be709a3d33442f.png

conn.close();61a4c26d1e5885305701be709a3d33442f.png }62a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png } catch (SQLException e) a4c26d1e5885305701be709a3d33442f.png{63a4c26d1e5885305701be709a3d33442f.png

e.printStackTrace();64a4c26d1e5885305701be709a3d33442f.png }65a4c26d1e5885305701be709a3d33442f.png return count;66a4c26d1e5885305701be709a3d33442f.png }67a4c26d1e5885305701be709a3d33442f.png }68a4c26d1e5885305701be709a3d33442f.png69a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png public static void main(String[] args) a4c26d1e5885305701be709a3d33442f.png{70a4c26d1e5885305701be709a3d33442f.png // 创建线程池测试负载军衡71a4c26d1e5885305701be709a3d33442f.png ExecutorService service = Executors.newCachedThreadPool();72a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png for (int

i = 0; i

< 10;

i++) a4c26d1e5885305701be709a3d33442f.png{73a4c26d1e5885305701be709a3d33442f.png

service.execute(new

QueryRunnable());74a4c26d1e5885305701be709a3d33442f.png }75a4c26d1e5885305701be709a3d33442f.png

service.shutdown();76a4c26d1e5885305701be709a3d33442f.png }77a4c26d1e5885305701be709a3d33442f.png78a4c26d1e5885305701be709a3d33442f.png}79a4c26d1e5885305701be709a3d33442f.png

第一種方法:當後端MYSQL服務器群是master-master雙向同步機制時,前端應用使用JDBC連接數據庫可以使用loadbalance方式,如下所示:

jdbc:mysql:loadbalance://dbnode_1:port,dbnode_2:port,dbnode_3:port,dbnode_n:port/dbname?user=xxxx;password=xxxxxxx;loadBalanceBlacklistTimeout=3000;&characterEncoding=utf-8

loadbalance方式有兩種負載均衡算法,一種是隨機式的輪詢算法,另一種是最短響應時間算法,具體會使用哪種算法、怎 人為指定使用哪種算法目前還不太清楚。。官方網站上也沒看到很明確的說明。

第二種方法:

當後端MYSQL服務器群是master-slave單向一主N

從的同步複製機制時,再使用loadbalance方式就會有問題了,因為如果有insert、update等寫操作改變了從機的數據就麻煩了,從機不會

將變化複製到主機,因此這種情況下需要實現“主讀寫、從只讀”的模式,為了達到這個目的可以使用replication方式,如下所示:

jdbc:mysql:replication://dbnode_1:port,dbnode_2:port,dbnode_3:port,dbnode_n:port/dbname?user=xxxx;password=xxxxxxxx;&characterEncoding=utf-8

replication方式可以很安全的實現寫操作只發送到主機執行,而從機只會接收到讀操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值