2015年3月3日星期二

Mysql主从不同步问题处理

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
Mysql主从不同步问题处理  阅读原文»

Mysql主从不同步问题处理

由于各种原因,mysql主从架构经常会出现数据不一致的情况出现,大致归结为如下几类

1:备库写数据

2:执行non-deterministicquery

3:回滚掺杂事务表和非事务表的事务

4:binlog或者relaylog数据损坏

数据不同步给应用带来的危害是致命的,当出现主从数据不一致的情况,常见的应对方法是先把从库下线,然后找个半夜三更的时间把应用停掉,重新执行同步,如果数据库的体积十分庞大,那工作量可想而知,会让人崩溃。本文介绍使用percona-toolkit工具对mysql主从数据库的同步状态进行检查和重新同步。

一:安装percona-toolkit

  # yum -y  install perl-Time-HiRes  # wget  http://www.percona.com/downloads/percona-toolkit/2.2.13/tarball/percona-toolkit-2.2.13.tar.gz  # tar -zxvpf percona-toolkit-2.2.13.tar.gz  # cd percona-toolkit-2.2.13  # perl Makefile.PL  # make  # make install  

二:修改mysqlbinlog格式binlog_format参数为row格式

mysqlbinlog日志有三种格式,分别为Statement,Mixed,以及ROW

1.Statement

每一条会修改数据的sql都会记录在binlog中。

优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。(相比row能节约多少性能与日志量,这个取决于应用的SQL情况,正常同一条记录修改或者插入row格式所产生的日志量还小于Statement产生的日志量,但是考虑到如果带条件的update操作,以及整表删除,alter表等操作,ROW格式会产生大量日志,因此在考虑是否使用ROW格式日志时应该跟据应用的实际情况,其所产生的日志量会增加多少,以及带来的IO性能问题。)

缺点:由于记录的只是执行语句,为了这些语句能在slave上正确运行,因此还必须记录每条语句在执行的时候的一些相关信息,以保证所有语句能在slave得到和在master端执行时候相同的结果。另外mysql的复制,像一些特定函数功能,slave可与master上要保持一致会有很多相关问题(sleep()函数,last_insert_id(),以及user-definedfunctions(udf)会出现问题).

2.Row

不记录sql语句上下文相关信息,仅保存哪条记录被修改。

优点:binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以rowlevel的日志内容会非常清楚的记录下每一行数据修改的细节。而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题

缺点:所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容,比如一条update语句,修改多条记录,则binlog中每一条修改都会有记录,这样造成binlog日志量会很大,特别是当执行altertable之类的语句的时候,由于表结构修改,每条记录都发生改变,那么该表每一条记录都会记录到日志中。

3.Mixed

是以上两种level的混合使用,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在StatementRow之间选择一种.新版本的MySQL中队rowlevel模式也被做了优化,并不是所有的修改都会以rowlevel来记录,像遇到表结构变更的时候就会以statement模式来记录。至于update或者delete等修改数据的语句,还是会记录所有行的变更。

主从数据库分别修改my.cnf文件相关配置项如下:

  binlog_format=ROW  

wKioL1T0IqbTifj_AAE9sN0TV0o570.jpg

wKiom1T0IajCTV2pAAFJketB500041.jpg

三:使用pt-table-checksum工具检查数据一致性情况

用法参考:

假设192.168.1.205是主库,192.168.1.207是它的从库,端口在

1.先校验

  #  pt-table-checksum --user=root --password=123456 \    --host=192.168.1.205 --port=3306 \    --databases=test  --tables=t2  --recursion-method=processlist \    --no-check-binlog-format  --nocheck-replication-filters \    --replicate=test.checksums  

2.根据校验结果,只修复192.168.1.207从库与主库不一致的地方:

  # pt-table-sync  --execute  --replicate \  test.checksums  --sync-to-master h=192.168.1.207,P=3306,u=root,p=123456  

3.修复后,再重新校验一次。执行第一步的语句即可。

4.检查修复结果:登陆到192.168.1.207,执行如下sql语句返回若为空,则说明修复成功:

  SELECT  *  FROM  test.checksums  WHERE  master_cnt <> this_cnt  OR master_crc <> this_crc  OR ISNULL(master_crc) <> ISNULL(this_crc)  

各参数含义

--nocheck-replication-filters:不检查复制过滤器,建议启用。后面可以用--databases来指定需要检查的数据库。

--no-check-binlog-format:不检查复制的binlog模式,要是binlog模式是ROW,则会报错。

--replicate-check-only:只显示不同步的信息。

--replicate=:把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。

--databases=:指定需要被检查的数据库,多个则用逗号隔开。

--tables=:指定需要被检查的表,多个用逗号隔开

h=127.0.0.1:Master的地址

u=root:用户名

p=123456:密码

P=3306:端口

下面我们来模拟下主从数据库不同步情况下的pt-table-checksum,为了方面,这里我们采用testschema

1:

Python [5] IT资产管理(上)  阅读原文»

  • 三日内更新
Python [5] IT资产管理(上)

上篇博客中已经介绍过Django的安装和基本使用,如果大家还有不明白请参考我的博客

Python [4] Django的安装和基础运行环境简介

http://467754239.blog.51cto.com/4878013/1613612

这篇博客和大家聊聊Python结合Django实现IT资产管理

基础环境:

  系统版本:CentOS 6.4 64bit  Python版本:2.6  Django版本:1.6.5  ip地址:192.168.1.210  

一、安装Django环境

  # rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm  # sed -i 's@^#@@' /etc/yum.repos.d/epel.repo  # sed -i 's@mirrorlist@#mirrorlist@' /etc/yum.repos.d/epel.repo  # yum -y install python-pip  # pip install 'django==1.6.5'  

二、创建工程和应用

  [root@localhost ~]# django-admin.py startproject Simplecmdb  [root@localhost ~]# cd Simplecmdb/  [root@localhost Simplecmdb]# django-admin.py startapp hostinfo  [root@localhost Simplecmdb]# tree ./  ./  ├── hostinfo  │   ├── admin.py  │   ├── __init__.py  │   ├── models.py  │   ├── tests.py  │   └── views.py  ├── manage.py  └── Simplecmdb      ├── __init__.py      ├── settings.py      ├── urls.py      └── wsgi.py  2 directories, 10 files  

三、配置应用

1、修改工程配置文件

  [root@localhost Simplecmdb]# vim Simplecmdb/settings.py  INSTALLED_APPS = (      'django.contrib.admin',      'django.contrib.auth',      'django.contrib.contenttypes',      'django.contrib.sessions',      'django.contrib.messages',      'django.contrib.staticfiles',      'hostinfo',             #添加此行  )  MIDDLEWARE_CLASSES = (      'django.contrib.sessions.middleware.SessionMiddleware',      'django.middleware.common.CommonMiddleware',      #'django.middleware.csrf.CsrfViewMiddleware',#注释此行(默认禁止第三方curl工具使用)      'django.contrib.auth.middleware.AuthenticationMiddleware',      'django.contrib.messages.middleware.MessageMiddleware',      'django.middleware.clickjacking.XFrameOptionsMiddleware',  )  LANGUAGE_CODE = 'zh-cn'               #修改此行  TIME_ZONE = 'Asia/Shanghai'   #修改此行  

2、添加应用的url访问

  [root@localhost Simplecmdb]# cat Simplecmdb/urls.py  from django.conf.urls import patterns, include, url  from django.contrib import admin  admin.autodiscover()  urlpatterns = patterns('',      # Examples:      # url(r'^$', 'Simplecmdb.views.home', name='home'),      # url(r'^blog/', include('blog.urls')),      url(r'^admin/', include(admin.site.urls)),      url(r'^hostinfo$','hostinfo.views.index'),    #添加此行  )  

3、定义搜集主机信息的数据模型(也就是字段名和数据类型)

  [root@localhost Simplecmdb]# cat hostinfo/models.py  from django.db import models  # Create your models here.  class Host(models.Model):      hostname = models.CharField(max_length=50)      ip = models.IPAddressField()      osversion = models.CharField(max_length=50)      memory = models.CharField(max_length=50)      disk = models.CharField(max_length=50)      vendor_id = models.CharField(max_length=50)      model_name = models.CharField(max_length=50)      cpu_core = models.CharField(max_length=50)      product = models.CharField(max_length=50)      Manufacturer = models.CharField(max_length=50)      sn = models.CharField(max_length=50)  

4、初始化模型数据库并生成数据库文件

  [root@localhost Simplecmdb]# python manage.py syncdb  Creating tables ...  Creating table django_admin_log  Creating table auth_permission  Creating table auth_group_permissions  Creating table auth_group  Creating table auth_user_groups  Creating table auth_user_user_permissions  Creating table auth_user  Creating table django_content_type  Creating table django_session  Creating table hostinfo_host  You just installed Django's auth system, which means you don't have any superusers defined.  Would you like to create one now? (yes/no): yes  Username (leave blank to use 'root'): root  Email address: zhengyansheng@nihao.com  Password:         #后台admin的登陆密码  Password (again):  Superuser created successfully.  Installing custom SQL ...  Installing indexes ...  Installed 0 object(s) from 0 fixture(s)  

5、注册后台admin并显示注册信息

  [root@localhost Simplecmdb]# vim hostinfo/admin.py    #注册数据库  from django.contrib import admin  from hostinfo.models import Host  # Register your models here.  class HostAdmin(admin.ModelAdmin):      list_display = [                  'hostname',                  'ip',                  'osversion',                  'memory',                  'disk',                  'vendor_id',                  'model_name',                  'cpu_core',                  'product',                  'Manufacturer',                  'sn']  admin.site.register(Host,HostAdmin)  

6、定义用户的响应请求

  [root@localhost Simplecmdb]# vim hostinfo/views.py  from django.shortcuts import render  from django.http import HttpResponse  from hostinfo.models import Host  # Create your views here.  def index(req):      print req      if req.method == 'POST':          hostname = req.POST.get('hostname')          ip = req.POST.get('ip')          osversion = req.POST.get('osversion')          memory = req.POST.get('memory')          disk = req.POST.get('disk')          vendor_id = req.POST.get('vendor_id')          model_name = req.POST.get('model_name')          cpu_core = req.POST.get('cpu_core')          product = req.POST.get('product')          Manufacturer = req.POST.get('Manufacturer')          sn = req.POST.get('sn')          host = Host()          host.hostname = hostname          host.ip = ip          host.osversion = osversion          host.memory = memory          host.disk = disk          host.vendor_id = vendor_id          host.model_name = model_name          host.cpu_core = cpu_core          host.product = product          host.Manufacturer = Manufacturer          host.sn = sn          host.save()          return HttpResponse('ok')      else:          return HttpResponse('no data')  

三、运行django的工程服务

  [root@localhost ~]# cd /root/Simplecmdb/  [root@localhost Simplecmdb]# python manage.py runserver 0.0.0.0:80  Validating models...  0 errors found  March 02, 2015 - 16:11:12  Django version 1.6.5, using settings 'Simplecmdb.settings'  Starting development server at http://0.0.0.0:80/  Quit the server with CONTROL-C.  

四、浏览器访问页面

1、访问主页面

wKioL1T0HQWAJ_25AAKQCuRFUnI711.jpg2、访问hostinfo页面

  因为我们没有传送任何数据,所以返回我们定义的字符串"no data"  

wKioL1T0HYXC40npAAEF7VEARGA736.jpg3、访问后台admin页面

  注册的账号是root,密码为123456  

wKioL1T0HlCjGu3nAAFJDR037kM619.jpg

wKiom1T0HT_gQ8J9AAHNMpLmNmU426.jpg

wKioL1T0HlHQ9kvhAAFwfXPWTbk183.jpg

五、以下是用Python实现对Linux主机的信息采集

搜集的信息主要包括:主机名、ip、系统版本、硬盘、内存、cpu的个数、cpu的厂商、序列号和生产商

  [root@localhost ~]# cat post_hostinfo.py  #!/usr/bin/env python  #coding:utf8  #author

阅读更多内容

没有评论:

发表评论