Pull to refresh
18
0
eisenhorn @d1m

Dev/SRE

Send message

Про MySQL. Зависит от сложности и размера БД, но я бы посоветовал обратить внимание на следующее:


  • В приведенном варианте восстановить БД отдельно взятого клиента так просто не получится. Лучше бекапить каждую БД отдельно.
  • Если у кого-то были процедуры, то их в бекапе не окажется.
  • mysqldump делает дамп в текстовом виде. Если БД большая, то это и долго, и много места занимает. Потому лучше вывод mysqldump сразу передавать в gzip, минуя промежуточный этап записи на диск.
  • Можно легко поймать ситуацию когда целостность данных в дампе нарушится. Потому хорошо добавить ключ --single-transaction.
  • Посмотреть percona xtrabackup. В этом случае получится делать бекап всех/некоторых БД быстро и не мешая пользователям, и с гарантированой целостностью.
Сразу скажу, я не очень разбираюсь во внутренностях Zookeeper.

По идее в кластере zookeeper-ам надо вписывать в конфиг уникальное значение zoo_id (0-255).
Плагин берет указанное значение (node_zoo_id), либо в случае если оно не указано — номер хоста из группы «zookeeper».
В моем случае инвенторий был статический, и выкрутился написанием плагина на питоне:

# vars_plugins/zookeeper_vars.py
from ansible import errors
from ansible import utils
import ansible.constants as C
from ansible.callbacks import display

class VarsModule(object):

    def __init__(self, inventory):
        self.inventory = inventory
        self.group_cache = {}
        self.known_zoo_ids = []

    def run(self, host, vault_password=None):
        inventory = self.inventory
        group = inventory.get_group('zookeeper')
        zk_addr = []
        if group is not None:
            hosts = group.get_hosts()
            for idx, host in enumerate(hosts):
                host_vars = host.get_variables()
                addr = host_vars.get('node_private_ip')
                if addr is None:
                    addr = host_vars.get('ansible_ssh_host', host.name)

                zk_port = host_vars.get('zookeeper_port', '2181')
                zk_addr.append({'host': addr, 'port': zk_port})

                node_zoo_id = host_vars.get('node_zoo_id', idx + 1)
                self.assign_zoo_id(host, node_zoo_id)

        result = {}
        result['zookeepers'] = zk_addr
        result['zookeepers_list'] = ','.join([':'.join([i['host'], i['port']]) for i in zk_addr])

        return result

    def assign_zoo_id(self, host, zoo_id):
        if zoo_id not in self.known_zoo_ids:
            host.set_variable('node_zoo_id', zoo_id)
            self.known_zoo_ids.append(zoo_id)
        else:
            display("warning: node_zoo_id of %s is already used!" % zoo_id, color='purple')
            new_zoo_id = int(zoo_id) + 1
            if new_zoo_id > 255:
                raise errors.AnsibleError("zoo_id (%s) for host %s is over 255!" % (new_zoo_id, host.name))
            self.assign_zoo_id(host, str(new_zoo_id))
Минималистичный конфиг того же monit'а не повредит. Ну и как минимум упоминание о том что этим стоит озаботиться.
Как правильно заметил farcaller, именно для этого и есть Gemfile.lock.
И нет, не может если:

1. в репозитории хранится как Gemfile, так и сгенерированный Gemfile.lock
2. и если выполняется все через bundle exec
Одни со временем становятся старше и умнее, другие — просто старше.
«Потому что я так сказал», «потому что я лучше знаю» и прочие — не аргумент. Это следствие некого опыта, проб и ошибок. И надо докопаться до причины.
Иногда таки приходится делать плохо если «сделать хорошо» просто нет возможности (hotfix для упавшего продакшена вместо переписывания библиотеки спровоцировавшей падение, ...).

Если всё действительно упирается в заросшего мхом и непробиваемого для здравого смысла руководителя то есть же вариант сменить место работы.
И я не поверю что программисту с головой на плечах и горящими глазками тяжело найти работу.
Хотя легко поверю что это будет чертовски тяжело для замшелого программера не желающего учиться чему-то новому.
Что бы ни говорил старший (и вероятно более опытный) сотрудник — это аж никак не отменяет необходимости думать своей головой и как минимум понимать почему посоветовали сделать именно так.
Решил еще раз посмотреть на таблички. Где говорится что скорость «АСК» — 80км/ч. Скорость «Зверя» — 40км/ч. Как, как «зверь» его догнал?
Черт. Cmd+enter работает неожиданно.

б) таки добавить 10-20 секунд чтобы закрыть явные нестыковки
Вы знаете, это звучит как «мы вот как-то так сделали, а потом сделаем лучше». В этот же минутный трейлер можно было а) не добавлять явную последовательность, а сделать набор разных боевых ситуаций
Эффекты — 4. Продуманность минутного ролика — 0.

Едет «АСК» по дороге, и тут СОВЕРШЕННО НЕОЖИДАННО сзади него обнаружился «Зверь». Метрах в 100. В пустыне. Иначе почему бы башня не была развернута в его сторону с самого начала?

И вот мы видим как артиллерия стоит в чистом поле. Где патрули и прочие наблюдательные посты? К ним через пустыню несутся шумно перестреливаясь как миниум 2 машины. По пустыне. Где их видно еще на горизонте. И по радио никто ничего не слышал, и глазками не видел. Не говоря уже о радарах. Но вот в ста метрах от артиллерии вдруг радиосвязь появилась, и внезапно «тролли» внезапно обрели способность видеть.

Далее. Подъехал «Барьер» дабы отремонтировать подбитую машину. Еще одна машина у него в прикрытии. Тут мы видим что за «зверем» ехало еще 2 машины. И тут они рванулись в чистое поле гоняться за шустриком. Перед артилерийскими установками. И это вместо того чтоб уничтожить стоящие на дороге цели.

В общем, выглядит красиво. Но пока-что не более того.
Большой минус — история хранится с самого первого бекапа. И если в него попадет что-то лишнее и большого размера — оно там так и останется если не транкейтить git-репо периодически.
Обновился и точно, в Lion скролы наконец-то исчезают, и вернулся фулскрин.
Тут есть проблема. Когда кодишь, ты видишь расположение клавиш которые нажимаешь. Ок, для слепого метода набора — ощущаешь. Потому просто в перчатках позиционировать руки в воздухе ни на что не опираясь будет очень затруднительно.

Потому требуется комбинация из очков/шлема/etc с дополненой реальностью, чтобы сквозь обычные прозрачные очки было видно клавиатуру/… в воздухе — дабы сопостовлять положение рук с положением объектов и сразу же видеть реакцию системы на «ввод».
Из хорошо забытого можно выделить шлемы виртуальной реальности — в свое время именно уровень развития железа сдерживал их.
А почему бы вместо того чтоб пускать апач от админа не взять apache2-itk в котором только этот вхост пустить из-под админа? Либо же вообще — cgi-скрипт на котором стоит setuid.
Если думать об этом заранее, то можно написать приложение так, чтобы создание API занимало минут 5.
Не могу сказать как в ZF, а в Rails используя RESTful routes можно уже облегчить себе жизнь, и данные запрашивать в XML/JSON/… Для простых случаев этого более чем достаточно.

XML-RPC/SOAP/… также никто не отменял для более тяжелых случаев.
hdparm, dd.

SCSI и есть синтетический.

Еще плохо что загрузочный диск может быть только IDE.
Производительность IDE-дисков у меня была просто чудовищно малой. Подключение дисков как scsi эту проблему решало, но при активном использовании ядро раз в дня два впадало в панику. Обычный LAMP-стек на ubuntu 10.04 server x86_64.
Увы, не скажу что столь активно как хотелось бы.
1
23 ...

Information

Rating
Does not participate
Location
США
Registered
Activity