zoukankan      html  css  js  c++  java
  • Mysql企业实战

    ==========================业务垂直分割:
    1》介绍说明:

        随着公司的业务规模扩展,DBA需要根据企业数据业务进行切割,垂直切割又称为纵向切割,垂直数据切割是根据企业网站业务、产品进行切分,比如:用户数        据、博客文章数据、照片数据、标签数据类型、群组数等等,每个业务都独立的分库分表进行切割. 如果一个应用只针对单纯的业务功能模块,那么可以直接连接相应       的被垂直切分的数据库,但是有些复杂的应用需要利用到相当多的业务数据,甚至牵扯到所有业务数据那么垂直切割将给应用带来一定的复杂度,而且对研发人员也会    有一定的影响,导致整个应用复杂度提升,那么Amoeba在其中充当了门面功能,疏通应用于多个数据库的通讯如果垂直切分功能:假如有有3个数据库:userdb blogdb      otherdb

    2》DB架构图

              

                    

    ================================业务水平分割 

    1》介绍说明

          上次我们讲到垂值切割。那么如果垂值切割不能满足企业需求怎么办??那么我们对架构进行进一步优化,让水平切割来解决这一问题,水平切割根User_ID范      围值划分,然后再进去取模 % 2 ,那么最终得到的值只有0 和1定义到每台DB Server 上去。此范围适合用于中小DB架构扩展,我们将在下一章将讲到360度环形库     的扩展,将用于大型DB架构设计;


      需求说明:
        总用户数量500万
        User_DB 存储用户基本信息<如、登录认证、个人信息>
        Blog_DB 存储用户博客文章
        Other_DB 存储其它业务
        经过垂直分割将3个DB分割到不同的服务器上面,然后进行水平切割将DB用户量分割开来,
        User_DB1 承载250万用户的基本信息 User_ID范围值<500万 User_ID取模 % 2 取值0的读此服务器
        User_DB2 承载250万用户的基本信息 User_ID范围值<500万 User_ID取模 % 2 取值1的读此服务器

        Blog_DB1 承载250万用户的博客文章 User_ID范围值<500万 User_ID取模 % 2 取值0的读此服务器
        Blog_DB2 承载250万用户的博客文章 User_ID范围值<500万User_ID取模 % 2 取值1的读此服务器

        Other_DB1 承载250万用户的其它信息 User_ID范围值<500万User_ID取模 % 2 取值0的读此服务器
        Other_DB2 承载250万用户的其它信息 User_ID范围值<500万User_ID取模 % 2 取值1的读此服务器
        相当于2台机器针对500万用户。各承载了。2分之1,此范围可以根据ID范围值,无限扩展下去。

    2》DB架构图

              

    3》环境案例实战

       因为我们上面已经讲过了读写分离,这个实战案例主要讲水平分割,通过Amoeba实现分割,判断ID范围值与取模
      1>Amoeba_Server(Linux) 10.0.0.203 实现水平切割
      2>User_DBA_Server1(Linux) 10.0.0.201 承载250万用户基本信息User_ID范围值<500万 User_ID取模 % 2 取值0的读此服务器
      3>User_DBA_Server2(Linux) 10.0.0.202 承载250万用户基本信息User_ID范围值<500 User_ID取模 % 2 取值1的读此服务器
      相当于2台机器针对500万用三户。各承载了。2分之1,此范围可以根据ID范围值,无限扩展下去。注意这2台机器。并没有做主             从,是单独的两台单机MYSQL

    4》设置DB_server1 DB_server2 设置Amoeba远程访问授权

      mysql-->grant all privileges on *.* to amoeba@'%' identified by '123456';

      mysql-->flush privileges;

    5》创建测试表

      在DB_server1 和DB_server2 上,两边的表结构以及表名是一样的。注意。
      创建t_user表
      create table zyalvin (
        user_id integer unsigned not null,
        user_name varchar(45),
        user_address varchar(100),
        primary key (user_id)
          )engine=innodb;
      Query OK, 0 rows affected (0.01 sec      

    6》配置Amoeba IP 与用户

      vim /usr/local/amoeba/conf/amoeba.xml

             

    7》配置Server1和Server2

      配置Server1:

               

               配置Server2

                  

                       

    8》配置水平分割规则

      # vim /usr/local/amoeba/conf/rule.xml
      tableRule name=”zyalvin,t_user”可以多个表,

             

              启动服务
         #:nohup bash -x amoeba &   

    9》插入测试数据

      在Amoeba Server登录:
      # mysql -uroot -p123456 -h 192.168.100.214 -P 9006
        mysql->use zytest;
       mysql->insert into zyalvin(user_id,user_name,user_address)values('1','user1','China');
       mysql->insert into zyalvin (user_id,user_name,user_address)values('2','user1','China');
       mysql->insert into zyalvin (user_id,user_name,user_address)values('3','user1','China');
       mysql->insert into zyalvin (user_id,user_name,user_address)values('4','user1','China');
       mysql->insert into zyalvin (user_id,user_name,user_address)values('5','user1','China');
       mysql->insert into zyalvin (user_id,user_name,user_address)values('6','user1','China');
       mysql->insert into zyalvin (user_id,user_name,user_address)values('7','user1','China');
       mysql->insert into zyalvin user_id,user_name,user_address)values('8','user1','China');
       mysql->insert into zyalvin (user_id,user_name,user_address)values('9','user1','China');
       mysql->insert into zyalvin (user_id,user_name,user_address)values('10','user1','China');
       DB_server1查看,偶数全部写入了server1

              

              DB_server2 查看,奇数全部写入了server2

                

    总结:
        (1)amoeba 是根据 sql 解析来进行水平切分的,需要把切分的关键字段(这里是user_id),加入到insert sql语句中,否则切分规              则无效。无效后,会在 server1, server2 均都插入数据。
        (2)amoeba插入数据的时候必须先use dbname(比如要先use test库名,或者查询带上库名和表名,test.t_user) 否则插入数据会默         认插到server1上面
        (3)在rule.xml 指定的ID范围,在插入数据user_id的时候,不能超过这个范围,否则分片无效,比如定义的ID范围为:1-500000号
        insert into zyalvin(user_id,user_name,user_address)values('5000001','user1','China');如果插入ID超过5000000,变成了                   5000001的话那么这个数据将同时写到server1和server2 导致分片无效。

    打开以.xml结尾的文件出现乱码时,用以下方法处理:

             

  • 相关阅读:
    ubuntu root 登录没有声音(waiting for sound system to respond)
    android openVG source prj
    http://source.android.com/ android官网(下载源码及sdk)
    8个优秀的Android开源游戏引擎
    2010開放原始碼創新應用開發大賽 (有很好的源码)
    GIT和repo使用方法:下载内核 android源码包
    Real6410系列教程 android
    [转]Protel布局文件转化为Allegro placement文件
    ubuntu网卡设置
    ubuntu 下安装java6的源
  • 原文地址:https://www.cnblogs.com/xiaocheche/p/7618297.html
Copyright © 2011-2022 走看看