понедельник, 21 декабря 2015 г.

MySQL Replication issues.

1) MySQL Skip Duplicate Replication Errors


Normally MySQL replication will stop whenever there is an error running a query on the slave. This happens in order for us to be able to identify the problem and fix it, and keep the data consistent with the mater that has sent the query. You can skip such errors, even if this is not recommended, as long as you know really well what are those queries and why they are failing, etc.
For example you can skip just one query that is hanging the slave using:
1
mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;
There might be cases where you will want to skip more queries. For example you might want to skip all duplicate errors you might be getting (output from show slave status;):
1
"1062 | Error 'Duplicate entry 'xyz' for key 1' on query. Default database: 'db'. Query: 'INSERT INTO ..."
If you are sure that skipping those errors will not bring your slave inconsistent and you want to skip them ALL, you would add to your my.cnf:
1
slave-skip-errors = 1062
As shown above in my example 1062 is the error you would want to skip, and from here we have: _ Error: 1062 SQLSTATE: 23000 (ER_DUP_ENTRY) Message: Duplicate entry ‘%s’ for key %d_
You can skip also other type of errors, but again don’t do this unless you understand very well what those queries are and what impact they have on your data:
1
slave-skip-errors=[err_code1,err_code2,...|all]
and for the error codes you can see them all here … (you will see them in your _show slave statu_s; also).
 
2)  Binlog has bad magic number (mysql error) 

My MySql server had the following lines in the error log:
 
121119 22:50:57  mysqld started
121119 22:50:57  InnoDB: Started; log sequence number 0 43655
121119 22:50:57 [ERROR] Binlog has bad magic number;  It's not a binary log file that can be used by this version of MySQL
121119 22:50:57 [ERROR] Can't init tc log
121119 22:50:57 [ERROR] Aborting

I fixed the problem by renaming the mysql-bin.index file:
 
mv mysql-bin.index mysql-bin.index-corrupt

This essentially takes the corrupt mysql-bin.index file out of service, causing mysql to create new one. All I can figure is that the original one got corrupted somehow. I really don’t have time to poke around and find out why today. Hope this helps somebody.
 

среда, 16 декабря 2015 г.

ForestDNSZones or DomainDNSZones FSMO says “The role owner attribute could not be read”

Source

This came up recently at a customer site. I was looking for the script that fixes this (remembering that the site the fix belongs to is attached to an article that has nothing to do with the issue, but it still works great).
What I ran into was a TON of really horrible advice out there on the forums. Please please please – if you get this error don’t follow any of the advice you read unless the article mentions running a script that is lovingly called “fixfsmo.vbs”
What you’re probably seeing in LDP or ADSIEdit in the CN=infrastructure,DC=DomainDNSZones,DC=MyDomainName,DC=Whatever (that or ForestDNSZones) is an entry for FSMO that points to a retired or missing DC. Sorta’ like this:
cn=ntds settings\0adel:f655f307-02gb-4923-b7be-fc5e2042b4c8,cn={MyOldDCName}\0adel:88c9073f-6964-4ab3-98f0-d30dcd12a908,cn=servers,cn={SiteName},cn=sites,cn=configuration,dc={MyDomainName},dc={Whatever}
What has happened is the DC who held the FSMO Role Holder for your DomainDNSZones or your ForestDNSZones (or both) application partition isn’t there anymore. Someone deleted it, decommissioned it, basically it failed somewhere along the line but the DC owned one or more of your AD Integrated DNS Zones. The deleted DC can be seen in the mess above after cn=___ and in most cases this means someone had to do metadata cleanup and forcibly removed the server from AD.
So you might be asking, “uh, Chris? Aren’t there just 5 FSMO role holders?” Well, see for yourself:
image
Without getting into a huge discussion about naming contexts or application partitions – just know that if your domain uses application partitions (likely) each of these will have a FSMO. Like your other FSMO role holders you may need to seize the role. Sadly, you can’t do this with NTDSUTIL. You can SEE them (see below) but you can’t do anything with them:
image
In the list of options above, note that there isn’t a Seize or Transfer option for the application partitions. You can select them or view them:
image
But that’s it. There is a way to change the owner when you’re in this state however, keep reading.
So again, without going into a lot of depth on naming contexts and Application Partitions (I actually have another post that deals with this which will be published early next month dealing with DNS and App Partitions) we will move on for now. The bottom line is, you have a partition in your Active Directory database with no owner. We need to fix this, and we can’t use NTDSUTIL to get there.
The NORMAL way to go about changing FSMO role holders for the applications partitions is to use an editor like ADSIEdit or LDP. As shown in the first image above, you see that this region is editable. BUT as you’ve probably already noticed, this will error out “The role owner attribute could not be read” because there’s nobody to talk to (the value owner is gone).
So you need to force this change to happen. This is described in KB949257, unfortunately this article’s title is talking about issues doing an adprep /rodcprep – and a lot of people miss it or skip over it when in actuality it has exactly the script you need.
What you need to do is go to the DC you want to hold the role (I usually use the PDCE, but not for any particular reason). Now create a new file and call it fixfsmo.vbs:
image
Then dump this text into it:
const ADS_NAME_INITTYPE_GC = 3
const ADS_NAME_TYPE_1779 = 1
const ADS_NAME_TYPE_CANONICAL = 2
set inArgs = WScript.Arguments
if (inArgs.Count = 1) then
    ' Assume the command line argument is the NDNC (in DN form) to use.
    NdncDN = inArgs(0)
Else
    Wscript.StdOut.Write "usage: cscript fixfsmo.vbs NdncDN"
End if
if (NdncDN <> "") then
    ' Convert the DN form of the NDNC into DNS dotted form.
    Set objTranslator = CreateObject("NameTranslate")
    objTranslator.Init ADS_NAME_INITTYPE_GC, ""
    objTranslator.Set ADS_NAME_TYPE_1779, NdncDN
    strDomainDNS = objTranslator.Get(ADS_NAME_TYPE_CANONICAL)
    strDomainDNS = Left(strDomainDNS, len(strDomainDNS)-1)
    
    Wscript.Echo "DNS name: " & strDomainDNS
    ' Find a domain controller that hosts this NDNC and that is online.
    set objRootDSE = GetObject("LDAP://" & strDomainDNS & "/RootDSE")
    strDnsHostName = objRootDSE.Get("dnsHostName")
    strDsServiceName = objRootDSE.Get("dsServiceName")
    Wscript.Echo "Using DC " & strDnsHostName
    ' Get the current infrastructure fsmo.
    strInfraDN = "CN=Infrastructure," & NdncDN
    set objInfra = GetObject("LDAP://" & strInfraDN)
    Wscript.Echo "infra fsmo is " & objInfra.fsmoroleowner
    ' If the current fsmo holder is deleted, set the fsmo holder to this domain controller.
    if (InStr(objInfra.fsmoroleowner, "\0ADEL:") > 0) then
        ' Set the fsmo holder to this domain controller.
        objInfra.Put "fSMORoleOwner",  strDsServiceName
        objInfra.SetInfo
        ' Read the fsmo holder back.
        set objInfra = GetObject("LDAP://" & strInfraDN)
        Wscript.Echo "infra fsmo changed to:" & objInfra.fsmoroleowner
    End if
End if

And run the script from an elevated command prompt. You should now be able (through NTDSUTIL as shown above or through ADSIEdit) be able to see that the owner has changed to a valid DC.
For clarification, you should only run this script if the DC that is listed is no longer available and you can’t change it manually through ADSIEdit.

UPDATE FROM COMMENTS:
"@ANC I got the same error when I used the script incorrectly. This worked for me.
cscript fixfsmo.vbs dc=forestdnszones,dc=mydomain,dc=org
then for domain zone:
cscript fixfsmo.vbs dc=domaindnszones,dc=mydomain,dc=org

I commented out the IF statement at the bottom as I had cleared the fsmoroleower value manually."

четверг, 10 декабря 2015 г.

Configuring vsftpd to authenticate with Active Directory

source

1) yum install vsftpd pam_ldap
2)
# egrep -v '^(#.*|)$' /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
dirmessage_enable=NO
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
guest_enable=YES
pam_service_name=vsftpd
userlist_enable=NO
tcp_wrappers=YES
virtual_use_local_privs=YES
dual_log_enable=YES
log_ftp_protocol=YES
local_root=<your ftp root directory>
chroot_local_user=YES

3)
# egrep -v '^(#.*|)$' /etc/pam.d/vsftpd
auth     required    pam_ldap.so
account  required    pam_permit.so
session  required    pam_limits.so

4)
# egrep -v '^(#.*|)$' /etc/pam_ldap.conf
uri ldap://<domain controller's name>/
ssl no
base dc=example,dc=com
binddn cn=user,dc=example,dc=com
bindpw <user password>
nss_map_objectclass posixAccount user
nss_map_objectclass shadowAccount user
nss_map_attribute uid sAMAccountName
nss_map_attribute homeDirectory unixHomeDirectory
nss_map_attribute shadowLastChange pwdLastSet
nss_map_objectclass posixGroup group
nss_map_attribute uniqueMember member
pam_login_attribute sAMAccountName
pam_filter objectclass=User

понедельник, 7 декабря 2015 г.

Настройка синхронизации времени в домене Active Directory

Взял в свою копилку отсюда, спасибо автору.

В этой статье я расскажу о:
  • топологии синхронизации времени среди участников Active Directory
  • оптимальной с моей точки зрения конфигурации сервера времени корневого эмулятора PDC
  • полезных командах для настройки и диагностики синхронизации времени
  • особенностях, которые нужно учитывать для виртуализированных контроллеров домена

Топология синхронизации времени среди участников Active Directory

Среди компьютеров, участвующих в Active Directory работает следующая схема синхронизация времени.
  • Контроллер корневого домена в лесу AD, которому принадлежит FSMО-роль эмулятора PDC (назовем его корневым PDC), является источником времени для всех остальных контроллеров этого домена.
  • Контроллеры дочерних доменов синхронизируют время с вышестоящих по топологии AD контроллеров домена.
  • Рядовые члены домена (сервера и рабочие станции) синхронизируют свое время с ближайшим к ним доступным контроллером домена, соблюдая топологию AD.
Корневой PDC может синхронизировать свое время как со внешним источником, так и с самим собой, последнее задано конфигурацией по умолчанию и является абсурдом, о чем периодически намекают ошибки в системном журнале.
Синхронизация клиентов корневого PDC может осуществятся как с его внутренних часов, так и с внешнего источника. В первом случае сервер времени корневого PDC объявляет себя как «надежный» (reliable).
Далее я приведу оптимальную с моей точки зрения конфигурацию сервера времени корневого PDC, при которой сам корневой PDC периодически синхронизирует свое время от достоверного источника в интернете, а время обращающихся к нему клиентов синхронизирует со своими внутренними часами.

Конфигурация NTP-сервера на корневом PDC

Конфигурирование сервера времени (NTP-сервера) может осуществляться как с помощью утилиты командной строки w32tm, так и через реестр. Где возможно, я приведу оба варианта.

Включение синхронизации внутренних часов с внешним источником

  • [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters]
    "Type"="NTP"
  • w32tm /config /syncfromflags:manual
Подробности — в библиотеке TechNet.

Объявление NTP-сервера в качестве надежного

  • [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config]
    "AnnounceFlags"=dword:0000000a
  • w32tm /config /reliable:yes
Подробности — в библиотеке TechNet.

Включение NTP-сервера

NTP-сервер по умолчанию включен на всех контроллерах домена, однако его можно включить и на рядовых серверах.
  • [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer]
    "Enabled"=dword:00000001

Задание списка внешних источников для синхронизации

  • [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters]
    "NtpServer"="time.nist.gov,0x8 ntp1.imvp.ru,0x8 ntp2.imvp.ru,0x8 time.windows.com,0x8 ru.pool.ntp.org,0x8"
  • w32tm /config /manualpeerlist:"time.nist.gov,0x8 ntp1.imvp.ru,0x8 ntp2.imvp.ru,0x8 time.windows.com,0x8 ru.pool.ntp.org,0x8"
Флаг 0x8 на конце означает, что синхронизация должна происходить в режиме клиента NTP, через предложенные этим сервером интервалы времени. Для того, чтобы задать свой интервал синхронизации, необходимо использовать флаг 0x1. Все остальные флаги описаны в библиотеке TechNet.

Задание интервала синхронизации с внешним источником

Время в секундах между опросами источника синхронизации, по умолчанию 900с = 15мин. Работает только для источников, помеченных флагом 0x1.
  • [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient]
    "SpecialPollInterval"=dword:00000384

Установка минимальной положительной и отрицательной коррекции

Максимальная положительная и отрицательная коррекция времени (разница между внутренними часами и источником синхронизации) в секундах, при превышении которой синхронизация не происходит. Рекомендую значение 0xFFFFFFFF, при котором коррекция сможет производиться всегда.
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config]
"MaxPosPhaseCorrection"=dword:FFFFFFFF
"MaxNegPhaseCorrection"=dword:FFFFFFFF

Все необходимое одной строкой

w32tm.exe /config /manualpeerlist:"time.nist.gov,0x8 ntp1.imvp.ru,0x8 ntp2.imvp.ru,0x8 time.windows.com,0x8 pool.ntp.org,0x8" /syncfromflags:manual /reliable:yes /update

Полезные команды

  • Применение внесенных в конфигурацию службы времени изменений
    w32tm /config /update
  • Принудительная синхронизация от источника
    w32tm /resync /rediscover
  • Отображение состояния синхронизации контроллеров домена в домене
    w32tm /monitor
  • Отображение текущих источников синхронизации и их статуса
    w32tm /query /peers

Особенности виртуализированных контроллеров домена

Контроллеры домена, работающие в виртуализированной среде, требуют к себе особенного отношения.
  • Средства синхронизации времени виртуальной машины и хостовой ОС должны быть выключены. Во всех адекватных системах виртуализации (Microsoft, vmWare и т. д.) присутствуют компоненты интеграции гостевой ОС с хостовой, которые значительно повышают производительность и управляемость гостевой системой. Среди этих компонентов всегда есть средство синхронизации времени гостевой ОС с хостовой, которое очень полезно для рядовых машин, но противопоказано для контроллеров домена. Потому как в этом случае весьма вероятен цикл, при котором контроллер домена и хостовая ОС будут синхронизировать друг друга. Последствия печальны.
  • Для корневого PDC синхронизация с внешним источником должна быть настроена всегда. В виртуальной среде часы не настолько точны как в физической, потому как виртуальная машина работает с виртуальным процессором и прерываниями, для которых характерно как замедление, так и ускорение относительно «обычной» частоты. Если не настроить синхронизацию виртуализированного корневого PDC с внешним источником, время на всех компьютерах предприятия может убегать/отставать на пару часов в сутки. Не трудно представить неприятности, которые может принести такое поведение.

Источники вдохновения

пятница, 4 декабря 2015 г.

Настройка Windows Server 2003/2008 для SQL Server 2008

Источник, автору моя благодарность.


Полезно и интересноЭта статья – вольная интерпретация рекомендаций: Microsoft, IBM, HP, Dell, QLogic, LSI, EMC, ACER, Bull, Fujitsu, Hitachi, NEC и Unisys. 

Материал подготовил Александр Гладченко.

Обновление установки Windows

После установки Windows Server 2008 x64, установите последний сервисный пакет обновлений (Service Pack), обязательно установите выходившие после сервисного пакета исправления безопасности и последние версии драйверов и аппаратных прошивок. 

Настройка файла подкачки Windows

Размер файла подкачки Windows в случае размещения на сервере только SQL Server не играет такой важной роли, как в типовых сценариях. SQL Server старается избегать листания. Размер файла подкачки можно выбрать небольшим, чтобы его было достаточно для формирования мини-дампов. Если сервер также обслуживает приложения, которые нуждаются в файле подкачки, размер его стоит выбирать в полтора раза больше, чем размер физической памяти сервера, но не более 50Гб. В случае монопольного владения ресурсами SQL Server, размещать файл подкачки можно на том же диске, где базируется операционная система. Минимальная активность работы с файлом подкачки не будет создавать конкуренцию другим задачам. В Windows Server 2003 имеется несколько предлагаемых вариантов настройки файла подкачки, он может настраиваться жёстко, может отсутствовать вообще или его размер будет управляться операционной системой. В последнем случае, Windows создаст файл подкачки, размер которого на один Мегабайт будет превышать размер физической памяти сервера. Такой выбор обусловлен тем, что ровно столько места необходимо для создания полного дампа памяти после аварии с выдачей “синего экрана”. Если вас такой дамп не интересует, можно взять управление размером файла подкачки в свои руки.

Настройка размера системных журналов

Размеры системных журналов стоит выбирать такими, чтобы их открытие для анализа или копирование по сети выполнялось за приемлемое время.

Настройка локальных политик Windows

Ограничьте размер системных дампов физической памяти размером 64 Гб, большой размер дампа непрактичен с точки зрения отладки. Можно оптимизировать управление памятью и существенно сократить листания с помощью установки локальной политики для пользователя, от имени которого запускается служба SQL Server. Политика называется “Lock pages in memory“, располагается она в узле “User rights assignment” локальных политик. Оболочку менеджера политик можно вызвать из командной строки, набрав там gpedit.msc и нажав ввод.
Ещё одной полезной локальной пользовательской политикой является мгновенная инициализация файла данных: “Выполнение задач обслуживания тома” (Perform Volume Maintenance). Для файлов журналов эта политика неприменима. Однако, включение этой политики хоть и позволяет сделать процесс создания файла данных, его приращение или восстановление практически мгновенным, оно чревато повышением рисков безопасности, т.к. инициализация не будет сопровождаться перезаписью новых файлов или приращиваемых к ним областей нулями. Т.е. существует риск, что расположенная в этих областях информация будет доступна для чтения и к удаленной ранее информации смогут получить доступ неавторизированные участники. Дополнительную информацию по безопасности этой операции можно найти в главе SQL Server Books Online: “Инициализация файлов базы данных“. Одной из альтернатив этому методу, также очень быстро позволяющей выполнять задачи создания и приращения файлов, является размещение файлов баз данных на “сырых” разделах (RAW).

Настройка Панели Управления Windows

Чтобы исключить снижение производительности в режиме энергосбережения, в оснастке “Электропитание” (Power Options) нужно выбрать режим “Высокая производительность” (High Performance). Стоит также убедиться, что сервер никогда не будет переключаться в спящий режим.
На закладке “Визуальные эффекты” можно отключить расходование процессорного времени на некритичные для работы сервера эффекты, выбрав режим “Обеспечить наилучшее быстродействие” (Adjust for best performance).

Настройка конфигурации системы

Отключите контроль учётных записей UAC. Для этого нажмите кнопку “Пуск” (Start), в списке “Программы” (All Programs) перейдите к папке “Администрирование” (Administrative Tools) и запустите утилиту “Конфигурация системы” (System Configuration). Отключить UAC можно на закладке “Сервис” (Tools), выбрав из списка средств задачу: “Отключите контроль учётных записей UAC”. Для применения изменений необходима перезагрузка системы.

Настройка кэширования ввода-вывода

Для включения кэширования операционной системой операций ввода-вывода логических дисков воспользуйтесь оснасткой Disk Management или Device Manager, перейдя в ней в узел Disk Drives. Для каждого настраиваемого устройства логического диска нужно выбрать Свойства (Properties) и перейти на закладку Policies. Для индивидуальной настройки дисков лучше подходит оснастка Disk Management, там настройки выполняются из свойств дисков, которые вызываются в графической, нижней части окна оснастки. Включение чекбокса “Enable write caching on the disk” разрешает кэширование записи на диск. После пометки этого чекбокса становится доступен для пометки второй чекбокс: “Enable advanced performance“. Включение обеих чекбоксов не только разрешает кэширование, но и заставляет операционную систему изымать из запросов ввода-вывода команды прямой записи на диск и сброса дискового кэша. Не рекомендуется включать эти чекбоксы если аппаратные кэши не имеют защиты от потери электропитания.
Если логический диск представлен внешним дисковым массивом, который оснащён аппаратным кэшем с батарейкой, можно не помечать второй чекбокс: “Enable advanced performance”. Однако, пометка этого чекбокса может повысить производительность записи в журнал транзакций.
Для вступления в силу изменений настроек кэша дисков перезагрузки сервера не требуется.

Настройка параметров сетевых плат

В окне Local Area Connection Properties мастера Network Connections панели управления Windows можно вызвать окно параметров сетевой платы, если нажать кнопку Configure. В этом окне на закладке Advanced перечислены несколько параметров, некоторые из них могут существенно влиять на производительность обмена данными по сети.
Link Speed and Duplex
Лучшим решением зачастую является согласованный выбор полнодуплексного режима связи в свойствах сетевой платы и в свойствах порта сетевого коммутатора/концентратора. Это не означает, что выбор автоматической подстройки там и тут будет работать хуже, просто история помнит такие случаи…
Существует ещё ряд распространённых параметров, настройка которых может помочь поднять производительность сетевого интерфейса (например, Receive Buffers, Coalesce Buffers, Offload features и т.п.). Чтобы выдрать верные значения для подобных параметров, обратитесь к документации производителя сетевой платы.
Для того чтобы исключить возможность отключения сетевого интерфейса в целях оптимизации энергопотребления сервера, стоит на закладке Power Management убрать пометку чекбокса “Allow the computer to turn off this device to save power“.

Отключение неиспользуемых протоколов

Для того чтобы убрать незначительную дополнительную нагрузку, создаваемую для обслуживания неиспользуемых сетевых протоколов, предлагается отключить или деинсталлировать такие протоколы. Например, первым кандидатом на отключение является TCP/IPv6, в силу пока ещё своей малой распространённости. Сделать это можно в окне Local Area Connection Properties мастера Network Connections панели управления Windows.
SQL Server также использует по умолчанию несколько протоколов, отключить лишние из них позволяет оснастка SQL Server Configuration Manager, в которой протоколы перечислены в узле “Сетевая конфигурация SQL Server”.
В большинстве случаев и в свойствах сетевого интерфейса и в протоколах SQL Server достаточно ограничится использованием протокола TCP/IPv4.
Если же требуется поддерживать несколько протоколов, стоит задать приоритеты использования протоколов и их провайдеров в окне Advanced Settings мастера Network Connections.

Настройка антивирусного программного обеспечения

В тех случаях, когда операционная среда или бизнес – требования вынуждают устанавливать на обслуживающем службы SQL Server сервере антивирусное программное обеспечение, настраивать антивирусное ПО нужно так, чтобы обновление вирусных сигнатур и сканирование системы происходило во время низкой активности SQL Server.
Необходимо настроить исключение сканирования файлов баз данных, журналов транзакций и резервных копий, которые типично имеют разрешения: mdf, ldf, ndf, bak и trn. Это позволит предотвратить повреждение этих файлов при попытке со стороны SQL Server их открытия, когда они уже открыты для проверки антивирусным ПО. Кроме того, необходимо принять меры для защиты каталогов полнотекстового поиска и содержащих данные Analysis Services от повреждений, связанных с активностью антивирусного программного обеспечения. Исключите также папку журналов SQL Server (MSSQL\Log), журнал ошибок открыт постоянно и в него может выводиться много событий. Если антивирусное ПО планируется использовать совместно с SQL Server работающем в кластере, нужно исключить сканирование кворум – диска и каталога: “c:\Windows\Cluster”. Для получения более подробной информации о требованиях к настройкам антивирусного ПО обратитесь к статье базы знаний Майкрософт: Guidelines for choosing antivirus software to run on the computers that are running SQL Server.
Во избежание вмешательства в работу служб SQL Server и для предотвращения увеличения времени их запуска из-за сканирования антивирусным ПО, рекомендуется исключить из проверки службы SQL Server. Наиболее распространенными в использовании являются службы: sqlservr.exe, sqlagent.exe, sqlbrowser.exe и sqlwriter.exe

Управление памятью в SQL Server

SQL Server, при необходимости, старается заполучить всю доступную ему оперативную память компьютера. Если установлено несколько экземпляров SQL Server, вероятна конкуренция за ресурсы памяти между менеджерами динамической памяти каждого экземпляра. До появления в SQL Server 2008 средств регулировки ресурсов, единственной возможностью снижения конкуренции за память между разными экземплярами была установка в глобальной конфигурации экземпляра SQL Server ограничений для максимального и минимального объемов используемой физической памяти. Кроме того, хорошей практикой считается оставлять не менее 10% оперативной памяти для нужд операционной системы.

Настройка параметров глобальной конфигурации SQL Server

affinity I/O mask
Этот параметр глобальной конфигурации позволяет изолировать обслуживание ввода-вывода данного экземпляра SQL Server одним или несколькими ядрами процессоров. Привязка ввода-вывода позволяет закрепить за вводом-выводом фиксированное число планировщиков. По умолчанию и в большинстве случаев маску привязки процессоров к вводу-выводу устанавливают в ноль, разрешая SQLOS самой управлять подобной привязкой. Чаще всего это позволяет получить максимальную производительность, однако, для некоторых типов рабочей нагрузки (которым характерны высокие нормы ввода-вывода), производительность может быть выше, если жёстко привязать ввод-вывод к одному или более ядру. Например, можно выделить одно ядро для ввода-вывода, как это показано ниже, в примере сценария для 16-ти ядерного сервера:
exec sp_configure ‘affinity mask’,0xFFFE
exec sp_configure ‘affinity I/O mask’,0x0001
Не обязательно для ввода-вывода выделять самое первое по порядку ядро. Это может быть ядро из того NUMA-узла, в домене близости которого находится адаптер ввода-вывода.
network packet size
Следующим параметром глобальной конфигурации, изменение которого может в некоторых случаях способствовать повышению производительности приложений баз данных, является “network packet size (B)”. Увеличение размера сетевого пакета до 8192 Байт может позволить добиться выигрыша за счёт лучшего выравнивания размера пакета с размером страницы SQL Server, которая равна 8 КБ. Однако, следует учитывать, что значение этого параметра по умолчанию (4096Б), является лучшим для большинства приложений. Только тестирование позволит выбрать для этого параметра оптимальную установку.

Настройка ключей системного реестра Windows

Важно! Эта глава содержит сведения об изменении реестра. Перед изменением реестра необходимо создать его резервную копию. Убедитесь в том, что знаете, как восстановить реестр в случае возникновения проблемы. Дополнительные сведения о создании резервной копии, восстановлении и изменении реестра см. в следующей статье базы знаний Майкрософт: Сведения о реестре Windows для опытных пользователей.
UseLargePages
Включение поддержки больших страниц может оказаться полезным для тех систем с SQL Server x64, которые оснащение большим объёмом оперативной памяти. Большие страницы способствуют повышению производительности за счёт увеличения TLB буфера процессора. Большие страницы могут использоваться для буферного пула и для кодовых страниц SQL Server. Для включения больших страниц на уровне SQL Server нужно задать флаг трассировки -T834 (это можно сделать через стартовые параметры). Кроме того, следует добавить ключ системного реестра. Содержимое reg-файла для добавления показано ниже:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sqlservr.exe]
“UseLargePages”=dword:00000001
Для вступления изменений в силу потребуется перезагрузка системы.
Если поддержка больших страниц включается для Windows 2008 R2, нужно учесть информацию из следующей статьи: After you enable large pages for a process in Windows 7 or in Windows Server 2008 R2, the process stops responding intermittently
Поддержка больших страниц включается автоматически, если выполняются перечисленные ниже условия, подробности в статье: SQL Server and Large Pages Explained….
  • SQL Server Enterprise Edition
  • У сервера должно быть больше 8Гб оперативной памяти
  • Привилегия “Lock Pages in Memory” должна быть дозволена локальной политикой для пользователя, в контексте которого запускается служба MSSQLServer.
LargeSystemCache/Size и IdleFrom0Delay
Установив значение LargeSystemCache в 0, тем самым устанавливается стандартный размер кэша файловой системы, который равен приблизительно 8 Мб, максимальный размер кэша файловой системы не будет превышать 512 Мб. Эта установка рекомендуется для таких программ, которые осуществляют кэширование памяти самостоятельно, и к таким программам относится SQL Server. Ниже показан reg-файла для задания такой установки:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management]
“LargeSystemCache”=dword:00000000
То, насколько агрессивно будет заниматься физическая память под задачи файлового кэша, зависит от установки следующего ключа реестра:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters]
“Size”=dword:00000001
Возможные значения: 1-вяло, 2-сбалансировано, 3-агресивно. Для установок с малой нагрузкой на файловый кэш, вполне достаточно 1.. Другие установки свойственны файловым серверам разного масштаба, впрочем, для тестов TPC-E часто выбирают 3.
Отключить режим экономии энергии, который тоже может замедлять некоторые операции, можно с помощью ключа IdleFrom0Delay. Сделать это можно так:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management]
“IdleFrom0Delay”=dword:00000000
IoPageLockLimit, DisablePagingExecutive и DontVerifyRandomDrivers
В одном из документов по оптимизации мне попадалась следующая формула: “IoPageLockLimit = (RAMMb – 65) * 1024″. С помощью ключа IoPageLockLimitможно повлиять на то, сколько байт система будет читать или писать на логичекский диск за один раз.
Когда оперативной памяти предостаточно, с помощью установкиDisablePagingExecutive можно не позволять SQL Server вытеснять в файл подкачки компоненты драйверов привилегированного и непривилегированного режимов, как и компоненты самого ядра ОС. УстановкаDontVerifyRandomDrivers в единицу позволяет сэкономить несколько процессорных циклов за счёт отключения отладочной проверки драйверов.
Вот как могут выглядеть значения этих ключей на практике:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management]
“DisablePagingExecutive”=dword:00000001
“DontVerifyRandomDrivers”=dword:00000001
“IoPageLockLimit”=dword:00d9bc00
CountOperations
Параметр CountOperations позволяет отключить сбор данных по некоторым счётчикам производительности, которые относятся к запросам ввода-вывода дисковой подсистемы и сетевых интерфейсов. Чтобы это сделать, нужно в ключе системного реестра “I/O System” установить значение 0 для следующего параметра:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\I/O System]
“CountOperations”=dword:00000000
Требуется перезагрузка.
NumberOfRequests и MaximumSGList
Эта пара ключей системного реестра предназначена для управления драйвером минипорта в момент инициализации последнего.
Увеличивая значение NumberOfRequests может способствовать повышению производительности обслуживания в Windows запросов дискового ввода-вывода, адресованных логическим дискам, и бывает эффективно только если эти логические диски являются аппаратными RAID-массивами, которые обладают возможностью распараллеливания запросов ввода-вывода. Рекомендованное значение можно найти в документации производителя FC-адаптера или RAID-контроллера. Увеличивать значение нужно осторожно, т.к. большое значение может привести даже к отказу системы. Например, для HBA адаптера QLogic, управляемого драйвером “QLogic Fibre Channel Miniport Driver”, в документации не рекомендуется превышать значение 150. Новое значение вступает в силу после перезагрузки системы или, в некоторых случаях, достаточно перезапустить адаптер (заблокировать/разблокировать).
Ключ MaximumSGList позволяет изменять используемый по умолчанию размер пакета передачи данных по шине (64Кб), который актуален для команд интерфейса SCSI. Если установить значение 255, то размер передаваемого одной командой объёма данных будет равняться мегабайту. Современные адаптеры умеют объединять до 265 сегментов данных, каждый по 4096 байт, что в сумме может дать размер одной передачи до 1048576 байт. Этот параметр широко используется для повышения эффективности использования ленточных накопителей, а также для оптимизаций таких задач SQL Server, которые оперируют большими запросами ввода-вывода, например, резервное копирование и восстановление.
В описаниях тесов TPC-C встречается установка обоих ключей в значение 255, как это показано в примере ниже:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ql2300\Parameters\Device]
“DriverParameter”=””
“BusType”=dword:00000006
“NumberOfRequests”=dword:000000ff
“MaximumSGList”=dword:000000ff
“CreateInitiatorLU”=dword:00000001
“DriverParameters”=”UseSameNN=1;buschange=0″
IdlePrioritySupported
Windows Server 2008 умеет учитывать приоритет запроса ввода-вывода и использует его для обслуживания фоновых задач. Однако, если система обслуживает только одно приложение, подобное SQL Server, и это приложение само заботится о приоритетах запросов ввода-вывода, отвлечение системных ресурсов на приоритезацию становится излишним. Отучить Windows от обслуживания приоритетов запросов можно внеся изменения в системный реестр для каждого из выбранных дисков, как это показано на примере использования ключа IdlePrioritySupported:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\SCSI\Disk&Ven_IBM&Prod_1726-4xx__FAStT\5&22c73432&0&000000\Device Parameters\Classpnp]
“IdlePrioritySupported”=dword:00000000
Ключ Classpnp скорее всего придётся добавить. Подобные тонкие настройки были мной замечены у IBM в тестах TPC-E.
TCPWindowSize
В Windows 2008 этот ключ больше не используется. В более ранних версиях увеличение размера окна может повысить эффективность сетевого трафика. Рекомендуемое значение (64240) для ключа TCPWindowSize представлено ниже:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
“TCPWindowSize”=dword:0000faf0
Подробности можно узнать в статье Базы Знаний Майкрософт: Description of Windows 2000 and Windows Server 2003 TCP Features.
Если размер окна в 64240 Байт тоже ограничивает производительность сети, существует возможность увеличения размера окна до одного Гигабайта. Ключ реестра TCP1323Opts разрешает динамическое мастабирование окна. Рекомендуемым значением для этого ключа является: 0x3.
Для дальнейшей оптимизации производительности сетевых интерфейсов попробуйте использовать следующие ключи системного реестра Windows, описание которых легко найти в Базе Знаний Майкрософт:TCPMaxConnectRetransmissionsTCPMaxDataRetransmissions,TCPTimedWaitDelayMaxUserPortMaxHashTableSizeNumTcbTablePartitions,TcpAckFrequencyMTU и EnablePMTUDiscovery.

Рекомендуемые к отключению службы

Application Management Alerter, Clipbook, Computer Browser, Distributed file system, Distributed link tracking client, Error Reporting Service, Fax Service, File Replication, Help and Support HTTP SSL, License Logging, Messenger, Portable Media Serial Number Service, Shell Hardware Detection, Windows Audio, Wireless Configuration.

Отключение защиты от перезаписи обработчика структурных исключений (SEHOP) в ОС Windows

Сохраните это в текстовом файле с расширением “reg” на сервере. Щёлкните по файлу два раза мышкой, и убедитесь, что изменения в реестре были применены успешно. Перезагрузите систему.
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\kernel]
“DisableExceptionChainValidation”=dword:00000001
Пояснения тут: http://support.microsoft.com/kb/956607
В тему
Параметры настройки для SQL Server 2005 и SQL Server 2008 при работе в высокопроизводительных рабочих нагрузок

среда, 11 ноября 2015 г.

vzctl - операции с OpenVZ-контейнером (VE)

Создание/Удаление

Создание окружения из шаблона:
vzctl create ${ID} --ostemplate ${OS}
vzctl create ${ID} --ostemplate ${OS} --config ${CONF}
Установка основных параметров
vzctl set ${ID} --onboot yes --nameserver ${NS} --hostname ${HOSTNAME} --save
Выставляем пароль рута:
vzctl set {ID} --userpasswd root:новыйпароль 
Запуск
vzctl start ${ID}
Если вы находитесь в Private Area VE (root@ubuntu:/vz/private/101#) или открыт какой либо файл, может выдать ошибку
vzquota : (error) quota check : getcwd: No such file or directory
vzquota init failed [1]
Вход в окружение
vzctl enter ${ID}
Остановка
vzctl stop ${ID}
Рестарт
vzctl restart {ID}
Удаление (сначало нужно остановить ВМ)
vzctl destroy {ID}

Установка сети

Добавить ip адрес для venet интерфейса в ВМ OpenVZ wiki
vzctl set {ID} --ipadd 192.168.0.55 --save
Удаление всех ip адресов для ВМ
vzctl set {ID} --ipdel all --save
Добавить интерфейс eth0 в ВМ OpenVZ wiki
vzctl set {ID} --netif_add eth0 --save
Удаление всех сетевых интерфейсов
vzctl set {ID} --netif_del all --save

Настройка квот

Оперативная память

privvmpages - объем памяти выделеное:максимальное
vzctl set {ID} --privvmpages 512M:512M --save
nano /etc/vz/conf/111.conf 
PRIVVMpagES="131072:131072"
В конфигурационном файле объем памяти указан в страницах по 4кБ
(131 072 * 4) / 1 024 = 512 МБ

Дисковое пространство

Установка выделеное:максимальное
vzctl set {ID} --diskspace 10G:10G --save
Количество inodes
vzctl set 777 --diskinodes 300000:320000 --save
Выставляем квоты для пользователей, групп внутри нашего VDS: (очень надо если на этом VDS еще и хостинг будет делаться. Потому как панели управления хостингом без этого ругаются)
vzctl set 103 --quotaugidlimit 200 --save

Процессорное время

cpuunits : распределение соотношения процессорного времени между СТ
от 50 до 50000
vzctl set ${ID} --cpuunits 1000 --save
Например: установим для 3х СТ параметры 1000, 2000 и 3000. Тогда 3ий СТ получит половину процессорного времени.
1000 + 2000 + 3000 = 6000
1000/6000-1/6 или 16% ; 2000/6000-1/3 или 34%; 3000/6000-1/2 или 50%
cpulimit : абсолютный максимум процессорного времени в процентах
от 10 до 100 для одноядерного ЦПУ и можно указывать >100 для многоядерного (при значении 100% будет занято время только одного ядра)
vzctl set ${ID} --cpulimit 20 --save
Поддержка cpulimit только (или пока только) в stable версии 2.6.18

Собственный хостинг репозиториев с помощью GitLab

Забрал отсюда, спасибо авторам


Техническая справка

Git — распределённая система управления версиями файлов. Проект был создан Линусом Торвальдсом для управления разработкой ядра Linux. Git используют такие проекты, как Chromium, jQuery, PHP, MediaWiki и прочие. Программа является свободной и выпущена под лицензией GNU GPL версии 2.
Статья о Git на Википедии
GitLab существует как в виде SAAS — веб-сайта с открытой регистрацией, так и в качестве индивидуального решения — GitLab Community Edition, которое можно установить на свой сервер и настроить под собственные нужды. Процесс установки достаточно долгий и требует root-доступа к серверу. Для стабильной работы GitLab требует от сервера как минимум двухъядерный процессор и 2 Гб ОЗУ. Такая конфигурация обеспечит быструю работу приложения и поддержку до 500 пользователей. GitLab поддерживает множество различных дистрибутивов Linux, но инструкция по установке расчитана на Debian/Ubuntu.

Установка

Установку можно разбить на несколько этапов:
  • установка необходимых системных утилит
  • установка Ruby
  • создание пользователя для SSH-подключений к GitLab
  • установка и настройка GitLab Shell
  • установка и настройка базы данных
  • установка и настройка самого GitLab
  • установка и настройка Nginx
Список внушительный, однако подавляющее большинство этапов состоят исключительно из консольных команд и занимают считаные секунды. Тем более, что какие-то из компонентов из списка выше на большинстве серверов уже установлены и им требуется лишь незначительная конфигурация. Итак, приступим.

Установка необходимых системных утилит

Для установки и настройки всех компонент, необходимых для работы GitLab, нам понадобятся: утилита sudo, набор библиотек для компиляции Ruby, актуальная версия Git и почтовый сервер.
Перед установкой каких-либо пакетов через утилиту apt-get, следует обновить список источников и существущие пакеты, выполнив в консоли такие команды:
apt-get update -y
apt-get upgrade -y
Здесь и далее команды нужно выполнять от имени пользователя root.
Первой в списке необходимых компонент идет утилита sudo. Она установлена на большинстве эксплуатируемых серверов. Но если вдруг ваш сервер совсем чист и непорочен, для ее установки необходимо выполнить в консоли следущую команду:
apt-get install sudo -y
Теперь установим библиотеки для компиляции Ruby:
sudo apt-get install -y build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev curl openssh-server redis-server checkinstall libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev logrotate
Убедитесь, что на сервере установлен git, и его версия не ниже 1.7.10:
sudo apt-get install -y git-core
git --version
Если установлена устаревшая версия, нужно удалить ее:
sudo apt-get remove git-core
Если git не установлен либо был удален предыдущей командой, нужно скачать и скомпилировать его:
# Устанавливаем библиотеки, необходимые для компиляции
sudo apt-get install -y libcurl4-openssl-dev libexpat1-dev gettext libz-dev libssl-dev build-essential

# Загружаем и компилируем исходники
cd /tmp
curl --progress https://git-core.googlecode.com/files/git-1.9.0.tar.gz | tar xz
cd git-1.9.0/
make prefix=/usr/local all
sudo make prefix=/usr/local install
Обратите внимание на версию git. На момент написания это версия 1.9.0. Уточнить, какая версия git является актуальной, можно на официальной странице проекта.
И наконец, если не установлен почтовый сервер, вот команда для его установки:
sudo apt-get install -y postfix
В процессе установки почтовый сервер попросит себя сконфигурировать. Для этого нужно выбрать на появившемся экране пункт «Internet Site» и указать правильное имя хоста — IP-адрес или доменное имя.

Установка Ruby

Для работы GitLab требуется Ruby 2.1.6. Если у вас уже установлен Ruby 1.8, его необходимо удалить перед установкой новой версии:
sudo apt-get remove ruby1.8
Теперь скачаем и скомпилируем Ruby 2.1.6:

mkdir /tmp/ruby && cd /tmp/ruby
curl -L --progress http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.6.tar.gz | tar xz
cd ruby-2.1.6
./configure --disable-install-rdoc
make
sudo make install
Помимо самого Ruby нам понадобится библиотека bundler:
sudo gem install bundler --no-ri --no-rdoc

Создание пользователя для SSH-подключений к GitLab

Создадим для SSH-подключений пользователя git:
sudo adduser --disabled-login --gecos 'GitLab' git

Установка и настройка GitLab Shell

GitLab Shell — это отдельная утилита для управления SSH-доступом и репозиториями. Для ее установки необходимо выполнить следущие команды:
# Переходим в домашнюю директорию
cd /home/git

# Загружаем исходный код
sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-shell.git -b v1.9.3
cd gitlab-shell

# Создаем конфигурационный файл
sudo -u git -H cp config.yml.example config.yml
После выполнения команд нужно отредактировать файл config.yml. В нем в настройке gitlab_url нужно указать будущий адрес GitLab, например:
gitlab_url: http://gitlab.example.com/"
Теперь устанавливаем и инициализируем утилиту:
sudo -u git -H ./bin/install

Установка и настройка базы данных

Для работы GitLab требует базу данных. Разработчики GitLab рекомендуют использовать PostgreSQL, однако поддержка MySQL также присутствует. Для установки PostgreSQL, выполните:
sudo apt-get install -y postgresql-9.1 postgresql-client libpq-dev
Для установки MySQL:
sudo apt-get install -y mysql-server mysql-client libmysqlclient-dev
sudo mysql_secure_installation
Во время установки необходимо будет придумать и ввести пароль root пользователя MySQL.
Теперь нужно создать саму базу данных для работы GitLab. Для этого нужно выполнить несколько SQL-запросов. Начнем с PostgreSQL. В командной строке это делается так:
# Логинимся в PostgreSQL
sudo -u postgres psql -d template1

# Создаем пользователя для GitLab
template1=# CREATE USER git;

# Создаем базу данных для GitLab и даем доступ к ней созданному пользователю
template1=# CREATE DATABASE gitlabhq_production OWNER git;

# Выходим из PostgreSQL
template1=# \q
Теперь MySQL (не забудьте вместо $password поставить хороший, крепкий пароль):
# Логинимся в MySQL
mysql -u root -p

# Тут нужно будет ввести пароль root пользователя MySQL

# Создаем пользователя для GitLab
# вводить 'mysql>' не нужно, он показан для наглядности процесса
# и не забудьте в следущей команде заменить $password на настоящий пароль!
mysql> CREATE USER 'git'@'localhost' IDENTIFIED BY '$password';

# Устанавливаем тип базы данных
mysql> SET storage_engine=INNODB;

# Создаем базу данных для GitLab
mysql> CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;

# Даем доступ к созданной базе данных пользователю GitLab
mysql> GRANT SELECT, LOCK TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `gitlabhq_production`.* TO 'git'@'localhost';

# Выходим из MySQL
mysql> \q

Установка и настройка самого GitLab

Этот этап самый сложный, поэтому будем выполнять его пошагово. Первый шаг — загрузка исходников GitLab. Делается это через git и выглядит примерно вот так:
# Переходим в домашнюю директорию
cd /home/git

# Загружаем GitLab
sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-ce.git -b 6-8-stable gitlab
Обратите внимание на флаг -b 6-8-stable во второй команде. На момент написания этой статьи актуальным является GitLab версии 6.8. Однако рекомендую перед установкой уточнить эту информацию на официальном сайте проекта и подставить в эту команду правильную версию. Кроме того, вместе с GitLab периодически обновляется и GitLab Shell, это также нужно учесть.
Второй шаг — развертывание и настройка. Сюда входят создание необходимых файлов конфигурации, создание необходимых приложению папок и установка прав доступа на уже существующие папки:
# Переходим в папку GitLab
cd /home/git/gitlab

# Создаем файл конфигурации для GitLab
sudo -u git -H cp config/gitlab.yml.example config/gitlab.yml

# Выставляем владельца и права на папки log/ и tmp/
sudo chown -R git log/
sudo chown -R git tmp/
sudo chmod -R u+rwX log/
sudo chmod -R u+rwX tmp/

# Создаем папку для сателлитов и выставляем на нее права
sudo -u git -H mkdir /home/git/gitlab-satellites
sudo chmod u+rwx,g+rx,o-rwx /home/git/gitlab-satellites

# Выставляем права на папки tmp/pids/ и tmp/sockets/
sudo chmod -R u+rwX tmp/pids/
sudo chmod -R u+rwX tmp/sockets/

# Выставляем праав на папку public/uploads/
sudo chmod -R u+rwX  public/uploads

# Создаем файл конфигурации для сервера Unicorn
sudo -u git -H cp config/unicorn.rb.example config/unicorn.rb

# Создаем файл конфигурации для Rack attack
sudo -u git -H cp config/initializers/rack_attack.rb.example config/initializers/rack_attack.rb
После выполнения команд нужно отредактировать файл config/gitlab.yml. В нем нужно указать следующие настройки:
Настройка Раздел Описание Пример
host gitlab Cюда надо вписать адрес, по которому будет доступен GitLab gitlab.example.com
email_from gitlab Тут нужно прописать email, с которого будет отправляться почта gitlab@example.com
support_emal gitlab Адрес тех. поддержки. Если его закомментировать, будет использован адрес из email_from support@example.com
bin_path git Установите значение /usr/local/bin/git, если компилировали git вручную на первом этапе установки /usr/local/bin/git
E-mail адрес из email_from также нужно установить в конфигурации git:
sudo -u git -H git config --global user.name "GitLab"
sudo -u git -H git config --global user.email "gitlab@example.com"
sudo -u git -H git config --global core.autocrlf input
Теперь нужно сконфигурировать базу данных. Для PostgreSQL:
sudo -u git cp config/database.yml.postgresql config/database.yml
sudo -u git -H chmod o-rwx config/database.yml
Для MySQL:
sudo -u git cp config/database.yml.mysql config/database.yml
sudo -u git -H chmod o-rwx config/database.yml
Не забудьте указать в файле config/database.yml логин и пароль для доступа к вашей базе данных. Следущий шаг — установка зависимостей. Делается это одной простой командой. Если вы используете PostgreSQL:
cd /home/git/gitlab
sudo -u git -H bundle install --deployment --without development test mysql aws
Если используете MySQL:
cd /home/git/gitlab
sudo -u git -H bundle install --deployment --without development test postgres aws
Теперь нужно инициализировать приложение. Сюда входят инициализация базы данных и установка ротации логов:
sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production

# Тут нужно будет ввести yes для подтверждения создания таблиц в базе данных

# Создаем инициализационный скрипт
sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab

# Добавляем GitLab в местный авторан
sudo update-rc.d gitlab defaults 21

# Создаем ротатор логов
sudo cp lib/support/logrotate/gitlab /etc/logrotate.d/gitlab
Теперь осталось проверить статус приложения и запустить его. Проверяется статус такой командой:
sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production
Корректно установленное приложение должно выдавать примерно следущее:
Если все хорошо — приложение можно запускать:
sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production
sudo service gitlab start

Установка и настройка Nginx

Последний этап установки GitLab — установка и настройка сервера Nginx. Установка выглядит так:
sudo apt-get install -y nginx
Копируем конфигурационный файл Nginx из дистрибутива GitLab:
sudo cp lib/support/nginx/gitlab /etc/nginx/sites-available/gitlab
sudo ln -s /etc/nginx/sites-available/gitlab /etc/nginx/sites-enabled/gitlab
Не забудьте указать правильный адрес вашего GitLab в файле /etc/nginx/sites-available/gitlab в настройке server_name раздела server. Мне также пришлось указать IP-адрес сервера в настройке listen раздела server. Теперь нужно перезапустить сервер:
sudo service nginx restart
 
Готово! Установка и настройка GitLab окончена. Убедитесь, что все правильно настроено, выполнив команду:
sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production
Если все пункты списка зеленые — значит, приложение установлено и настроено верно и можно начинать работу. Для этого зайдите по адресу приложения и авторизуйтесь, используя данные по умолчанию:
Логин:  root
Пароль: 5iveL!fe
Не забудьте сменить пароль после авторизации! Приятной работы!

пятница, 30 октября 2015 г.

Установка нескольких версий Redmine с конкретными версиями ruby (nginx + passenger + rvm + Ubuntu 14.04)


Статья недоработана, но в плане справочной уже вполне себе :-)

 

Установка Nginx и Passenger


Установим PGP-ключ:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7

Добавим поддержку HTTPS для APT (APT репозиторий Phusion Passenger хранится на HTTPS-сервере):
sudo apt-get install apt-transport-https ca-certificates

Добавим сам репозиторий. В /etc/apt/sources.list.d/passenger.list поместим:
deb https://oss-binaries.phusionpassenger.com/apt/passenger trusty main

Затем установим соответствующие права и обновим списки пакетов:
sudo chown root: /etc/apt/sources.list.d/passenger.list
sudo chmod 600 /etc/apt/sources.list.d/passenger.lis
sudo apt-get update

Установим Nginx и Passenger:
sudo apt-get install nginx-extras passenger

Раскомментируем passenger_root и passenger_ruby в конфиге nginx: /etc/nginx/nginx.conf.

Перезапустим nginx:
sudo service nginx restart
 
Настроим nginx (пример): 
cat /etc/nginx/sites-available/redmine-test 
server {
  listen  8080;
  server_name project-t.centrofinans.ru;
  root /opt/redmine-3.1/public;
  passenger_user www-data;
  passenger_group www-data;
  passenger_enabled on;
  passenger_ruby /usr/local/rvm/gems/ruby-1.9.3-p551/wrappers/ruby;
  allow all;
  client_max_body_size      10m; # Max attachemnt size
}


Установка RVM и Rails


RVM нам нужен по нескольким причинам. Во-первых, велика вероятность, что в репозиториях убунты нету версии Ruby, которую вы используете в своём проекте. Во-вторых, через него удобнее установить Rails (чем через gem install rails), т.к. он подтягивает необходимые пакеты автоматически. В-третьих, если на сервере будет висеть несколько проектов, то вероятно, что они будут использовать разные версии Ruby, и тут нам поможет RVM.

gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
\curl -sSL https://get.rvm.io | bash -s stable --rails

После установки нужно выйти и зайти в шелл.

P.S. Если где-то в окружении не хватает rvm или rails, выполним "source /usr/local/rvm/scripts/rvm" или пропишем эту строку в profile (~/.profile или для всех /etc/profile).

 Нам нужна версия руби:


$ rvm install 1.9.3
 
Для удобства создадим для каждого проекта свой набор гемов:
$ rvm use 1.9.3
$ rvm gemset create redmine-3.1
 
Для того, чтобы rvm автоматически переключался на нужную версию руби и набор гемов делаем следующее:

$ echo "rvm use 1.9.3@redmine-3.1" > /opt/redmine-3.1/.rvmrc
 
Теперь в консоли при смене каталога проекта будет автоматически подключена нужная версия руби и набор 
гемов для проекта. 


Установка Redmine


cd /opt
svn co http://svn.redmine.org/redmine/branches/3.1-stable redmine-3.1
cd /opt/redmine-3.1
 
 
Чтобы указать необходимую версию Ruby выполним:

rvm use <версия Ruby>
passenger-config --ruby-command

На строке с префиксом "To use in Nginx :" скопируем оставшуюся часть и добавим в соответствующую запись server конфигурации nginx, завершив точкой с запятой (пример выше).



Add following lines
production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: redmine
  encoding: utf8
 

Plugins installation

Unarchive plugins to /plugins/ folder
cd /var/data/redmine bundle install

Configuring redmine

Setup redmine folder permissions

cd /var/data/redmine mkdir public/plugin_assets
chown -R www-data:www-data files log tmp public/plugin_assets config.ru chmod -R 755 files log tmp public/plugin_assets

Create database

mysql -u root -p Execute following lines to MySQL
CREATE DATABASE redmine character SET utf8; CREATE user 'redmine'@'localhost' IDENTIFIED BY 'redmine'; GRANT ALL privileges ON redmine.* TO 'redmine'@'localhost'; exit

Migrate database

cd /var/data/redmine bundle exec rake db:migrate bundle exec rake redmine:plugins

Generate session store

bundle exec rake generate_secret_token

Start web server

service nginx start

Restart Redmine

touch /var/data/redmine/tmp/restart.txt
 
 

RVM - несколько версий Ruby на одном сервере

Источник, спасибо автору.

Идея

Идея Ruby Version Manager состоит в разработке, где требуется иметь одновременно несколько версий Ruby и различные варианты Rails под ними.

Общая схема:

Представляет собой стандартную схему frontend + backend. В качестве backend выступает nginx с модулем passenger
  1. nginx (frontend) - проксирование, стандарт;
  2. nginx (backend's) - работа приложений через passenger:
    • каждый backend работает на порту 8<Ruby-version> (например, 8191, 8192);
    • каждое приложение, работая под версией Ruby, может использовать требуемый Rails (через gemset).
Сервер на котором производилась установка: Debian 5.0.8 i686.

Установка

Устанавливаем пакеты необходимые для компиляции:
apt-get install git-core git curl file   \
                gcc make automake autoconf automake1.9 \
                binutils g++ g++-multilib checkinstall
apt-get install libssl-dev libxslt-dev libxml2-dev
apt-get install libcurl4-openssl-dev libmysql++-dev
apt-get install libpcre3 libpcre3-dev

RVM

Установка RVM:
bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)
/etc/rvmrc
umask g+w
export rvm_path="/usr/local/rvm"
export rvm_source_path="${rvm_path}/src"
export rvm_log_path="${rvm_path}/log"
export rvm_bin_path="${rvm_path}/bin"
export rvm_gems_path="$rvm_path/gems"
export rvm_tmp_path="${rvm_tmp_path:-"$rvm_path/tmp"}"
export rvm_install_on_use_flag=0
export rvm_gemset_create_on_use_flag=0
# export rvm_make_flags="-j7"
export rvm_trust_rvmrcs_flag=1
export rvm_pretty_print_flag=1
~/.bashrc
if [ -s "$HOME/.rvm/scripts/rvm" ]; then
  source "$HOME/.rvm/scripts/rvm" # This loads RVM into a shell session.
elif [ -s "/usr/local/rvm/scripts/rvm" ]; then
  source "/usr/local/rvm/scripts/rvm"
fi

Ruby в RVM

Установка Ruby:
rvm package install zlib
rvm install 1.9.1-p378 --with-zlib-dir=$rvm_path/usr
rvm install 1.9.2-p180 --with-zlib-dir=$rvm_path/usr
Проверка выбора Ruby
# rvm --default use 1.9.1
# rvm list

rvm rubies
=> ruby-1.9.1-p378 [ i386 ]
   ruby-1.9.2-p180 [ i386 ]

Системный Passenger

Сборка и установка passenger:
cd /usr/local/src
wget http://rubyforge.org/frs/download.php/74471/passenger-3.0.5.tar.gz
tar -xzvf ./passenger-3.0.5.tar.gz
mv -f passenger-3.0.5 /usr/local/
Passenger установлен в /usr/local/passenger-3.0.5

Поддержка SSL в Ruby

Добавление поддержки SSL:
rvm gem install rack
rvm package install openssl
rvm use ruby-1.9.1-p378
cd /usr/local/rvm/src/ruby-1.9.1-p378/ext/openssl/
ruby extconf.rb
make
make install 
rvm use ruby-1.9.2-p180
cd /usr/local/rvm/src/ruby-1.9.2-p180/ext/openssl/
ruby extconf.rb
make
make install

Сборка backend (nginx + passenger-module)

Собираем nginx с модулем passenger. Исходники помещаем в /usr/local/src :
cd /usr/src
wget http://sysoev.ru/nginx/nginx-1.0.2.tar.gz
tar xzvf nginx-1.0.2.tar.gz
Далее необходимо скачать и развернуть исходники pcre-8.10
cd /usr/local/src/nginx-1.0.2
Сконфигурировать сборку:
sh ./configure \
 --prefix='/usr/local/nginx' \
 --with-http_ssl_module  \
 --with-pcre='/usr/local/src/pcre-8.10' \
 --add-module='/usr/local/passenger-3.0.5/ext/nginx' \
 --user=www-data \
 --group=www-data \
 --error-log-path=/var/log/nginx-rb/error.log \
 --pid-path=/var/run/nginx-rb.pid \
 --lock-path=/var/lock/nginx-rb.lock \
 --http-client-body-temp-path=/var/lib/nginx-rb/body \
 --http-proxy-temp-path=/var/lib/nginx-rb/proxy \
 --http-fastcgi-temp-path=/var/lib/nginx-rb/fastcgi \
 --with-http_ssl_module \
 --with-http_dav_module \
 --with-http_gzip_static_module \
 --with-http_stub_status_module \
 --without-mail_pop3_module \
 --without-mail_smtp_module \
 --without-mail_imap_module
В результате подготовлена сборка nginx-ruby-backend в каталог /usr/local/nginx Выполнить сборку debian-пакета:
checkinstall -D make install
Указать имя пакета "nginx-rb" и описание пакета "Nginx-1.0.2 (backend) with passenger-3.0.5 module"

Настройка

frontend

Стандартная настройка. Варианты проксирования:
  1. по количеству backends/приложений;
  2. "универсально" - в зависимости от $request_uri/$server_name переводить на тот или иной upstream.
Второй вариант потребует меньше конфигураций и изменений во frontend.

backend

На примере backend ruby-1.9.2. Настроим для запуска дополнительный экземпляр nginx-backend:
/usr/local/nginx/etc/nginx-rb-192.conf:
  • пути к pid/лог-файлам;
  • пути к sites-enabled;
  • порт листинга (например, 8192 = 8<ruby-version>);
  • глобальные настройки passenger/ruby:
      http {
          ...
          passenger_root /usr/local/passenger-3.0.5;
          passenger_ruby /path-to-ruby;
          ...
      }
    
Узнать путь к конфигурационному файлу nginx-rb-192.conf (pass-to-ruby):
# rvm use ruby-1.9.2-p180 && which ruby
/etc/init.d/nginx-rb-192:
Включить в автозапуск:
# update-rc.d nginx-rb-192 defaults

Passenger

В конфигурации виртуального хоста backend необходимо указать (минимально):
server {
    listen          8192;
    server_name     <app_name>.domain.tld;
    root            /home/applications/<app_name>/prod/bin/public;
    rails_env       production;
    passenger_user  <app_name_user>;
    passenger_group <app_name_user>;
    passenger_enabled on;
}

Ruby

Gemsets

Принципиально возможно использовать несколько версий Rails под каждой развернутой Ruby. Достигается это манипуляциями с RVM/Gemset. Пример. Для Ruby-1.9.2 необходимо иметь rails-2.3.5 и rails-3.0.5 Формируем 2 gemset'а:
# rvm ruby-1.9.2-p180
# rvm gemset create rails235 rails305
ERROR: Gemset 'rails305' does not exist, rvm gemset create 'rails305' first.
'rails235' gemset created (/usr/local/rvm/gems/ruby-1.9.2-p180@rails235).
'rails305' gemset created (/usr/local/rvm/gems/ruby-1.9.2-p180@rails305).
Ошибка в выводе не принципиальна, появляется не всегда.
В итоге под ruby-1.9.2 имеется 3 gemset'а:
  • global - набор по-умолчанию (gem'ы из него автоматически доступны из всех наборов)
  • rails235
  • rails305
В дальнейшем возможны следующий манипуляции:
  • в global устанавливать gem'ы, необходимые для базовой поддержки приложений (не требующие вариаций по версиям и т.п.);
  • в railsNNN - устанавливать непосредственно rails требуемой версии и связанные с ним gem'ы.
Возможно более разветвленное дерево gemset'ов (в данной статье не рассматривается). Установка gem в gemset (важен выбор назначения — ruby-<version>@<gemset>):
# rvm 1.9.2-p180@rails305
# gem install rails -v 2.3.5
# rvm 1.9.2-p180@rails306
# gem install rails -v 3.0.5
Информация по выбранному gemset'у:
# rvm gemset list
gemsets for ruby-1.9.2-p180 (found in /usr/local/rvm/gems/ruby-1.9.2-p180)
   global
   rails235
=> rails305

Приложения

Для использования возможностей RVM необходимо выдержать следующую схему размещения приложений:
Структура каталогов: /home/applications/<app_name>/<app_type> - корневой каталог (app_root) - домашний каталог пользователя-владельца приложений;
/home/applications/<app_name>/<app_type>/bin - каталог приложения (app_home) В каталогах создать (dot)rvmrc — файлы:
  • для app_root (непосредственно позволяет использовать RVM):
    rvm_path="/usr/local/rvm"
    rvm_trust_rvmrcs_flag=1
    rvm_install_on_use_flag=1
    
  • для app_home (позволяет автоматически выбирать при входе в этот каталог версию Ruby и, при необходимости, gemset под RVM):
    #!/usr/bin/env bash
    environment_id="ruby-1.9.2-p180@rails305"
    if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
      && -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]] ; then
      \. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
    
      [[ -s ".rvm/hooks/after_use" ]] && . ".rvm/hooks/after_use"
    else
      rvm --create use "$environment_id"
    fi
    
Собственно выбор версии - environment_id. В app_home, в configure/ поместить файл setup_load_paths.rb:
if ENV['MY_RUBY_HOME'] && ENV['MY_RUBY_HOME'].include?('rvm')
  begin
    rvm_path     = File.dirname(File.dirname(ENV['MY_RUBY_HOME']))
    rvm_lib_path = File.join(rvm_path, 'lib')
    $LOAD_PATH.unshift rvm_lib_path
    require 'rvm'
    RVM.use_from_path! File.dirname(File.dirname(__FILE__))
  rescue LoadError
    # RVM is unavailable at this point.
    raise "RVM ruby lib is currently unavailable."
  end
end
# Select the correct item for which you use below.
# If you're not using bundler, remove it completely.
# If we're using a Bundler 1.0 beta
ENV['BUNDLE_GEMFILE'] = File.expand_path('../Gemfile', File.dirname(__FILE__))
require 'bundler/setup'
# Or Bundler 0.9...
if File.exist?(".bundle/environment.rb")
  require '.bundle/environment'
else
  require 'rubygems'
  require 'bundler'
  Bundler.setup
end

Контроль

Nginx

Штатные методы, с учетом наличия нескольких экземпляров.

Ruby

Вывод текущей версии Ruby:
# rvm list
Вывод текущего gemset:
# rvm gemset list
Вывод списка установленных gem:
# rvm gem list

Rails

Для перезапуска rails-процесса достаточно сделать в каталоге приложения:
# touch tmp/restart.txt

Passenger

Проверка статуса passenger:
  • /usr/local/passenger-3.0.5/bin/passenger-status
    
    Выдает несколько PID (по количеству backends);
  • /usr/local/passenger-3.0.5/bin/passenger-status <PID>
    
    Выдает статус rails-процессов по выбранному backend.

Ограничения

GEM могут быть установлены только от привилегированного пользователя. Для установки gem от имени непривилегированного пользователя требуется доработка.

Литература

  1. Phusion Passenger users guide, Nginx version
  2. NGINX
  3. Using RVM rubies with Passenger